$re = '/^[^.#,]*[.#,].*?\bMY_STRING\b[^,\r\n]*;(?:video|comment)(*SKIP)(*FAIL)|\bMY_STRING\b/m';
$str = '[1]
text,MY_STRING ;comment
text,MY_STRING text ;comment
text,text MY_STRING text ;comment
--------------------------------------------------------------
-> dont catch any above because exist a
**comma** before #MY_STRING# and ;comment after.
--------------------------------------------------------------
[2]
text, MY_STRING , text ;comment
--------------------------------------------------------------
-> catch because exist a **comma** after #MY_STRING#
--------------------------------------------------------------
[3]
text, MY_STRING, MY_STRING ;comment
--------------------------------------------------------------
-> catch first #MY_STRING# but don\'t catch last #MY_STRING#
because she is between , and ;comment
--------------------------------------------------------------
[4]
MY_STRING
MY_STRING,text
text, MY_STRING,
MY_STRING ;comment
text MY_STRING ;comment
text,MY_STRING,text ;comment
%MY_STRING% , (MY_STRING)
--------------------------------------------------------------
-> catch all, because there\'s no [comma . #] preceding #MY_STRING#
and no [# ;comment ;video] succeeding
--------------------------------------------------------------
[5]
.MY_STRING
#MY_STRING
MY_STRING#
--------------------------------------------------------------
- > dont catch any
Independent of where MY_STRING is, either what it has between, don\'t catch any, because they have . or # preceding/proceeding the string.
--------------------------------------------------------------
[6]
MY_STRING, .MY_STRING, #MY_STRING, text, MY_STRING
text, MY_STRING#, MY_STRING, .MY_STRING
--------------------------------------------------------------
-> same as above, just catch MY_STRING samples not containing . #
--------------------------------------------------------------
[7]
text, MY_STRING ;video
MY_STRING ;video
#MY_STRING, MY_STRING, text, text MY_STRING ;video
--------------------------------------------------------------
- > In this case, the string will not be caught independent of where it is or what it has preceding/succeeding because exist the string ;video at the ending.
--------------------------------------------------------------
[8]
text,MY_STRING, text ;comment
^ ok catch (reason explained above)
--------------------------------------------------------------
[9]
text,MY_STRING@ text ;comment
-------------------------------------------------------------- ^ dont catch, because there\'s no comma after the string, and there\'s a comma before and ;comment after
--------------------------------------------------------------
[10]
MY_STRING,text,#MY_STRING,text,text,%MY_STRING% @ $text #text <text> ;comment
^[1] ^[2] ^[3]
--------------------------------------------------------------
[1] catch
[2] don\'t (# preceding)
[3] don\'t catch, because there\'s a comma preceding, no comma succeding and at the end line exist the string ;comment
--------------------------------------------------------------
[11]
.MY_STRING,text,MY_STRING,text,text,%MY_STRING% @ $text, #text <text> ;comment
^[1] ^[2] ^[3] ^[4]
--------------------------------------------------------------
[1] don\'t (dot preceding)
[2] catch
[3] catch because there\'s a comma on [4] so the string is not anymore between a comma preceding and ;comment succeeding, she is now between a comma preceding a comma succeeding and ;comment';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for PHP, please visit: http://php.net/manual/en/ref.pcre.php