Замените имена в полнотекстовом поиске, игнорируя знаки препинания и оставляя их в такт. PHP и регулярное выражение

Я пытаюсь заменить определенные вхождения строк в текстовом файле ссылками. Некоторые объекты состоят более чем из одного слова, т. е. представляют собой строки с пробелами между ними. По сути, я ищу регулярное выражение, которое учитывает пунктуацию и нечувствительно к регистру. Мое «решение», кажется, просто ходит по кругу, и моих знаний о регулярных выражениях недостаточно для этого :(

$pattern = '/[ ._*&^%$#!?!]Anthony Anderson[ ._*&^%$#!?!]/i';

$replacement = '[[Tony Anderson]]';

$subject = 'Anthony anderson. (born August 15, 1970) is an actor, comedian, and writer. He has starred ... the ANTHony Anderson, as well as in Fox sitcom. anthony Anderson. Anthony aNderson? !Anthony AnderSon. Anthony    Anderson. . anthony
anderson. Anthony Andersoneon should not match neither should Santhony Anderson ';

echo preg_replace($pattern, $replacement, $subject, -1 );

Получил меня так далеко:

Энтони Андерсон. (родился 15 августа 1970 г.) - актер, комик и писатель. Он снялся ... у ЭНТОНИ Андерсона, а также в ситкоме Fox. [[Тони Андерсон]][[Тони Андерсон]] [[Тони Андерсон]] Энтони Андерсон. . Энтони Андерсон. Энтони Андерсон не должен соответствовать, как и Сантони Андерсон.

Но я после:

[[Тони Андерсон]]. (родился 15 августа 1970 г.) - актер, комик и писатель. Он снялся ... в [[Тони Андерсон]], а также в ситкоме Fox. [[Тони Андерсон]]. [[Тони Андерсон]]? ![[Тони Андерсон]]. [[Тони Андерсон]]. . [[Тони Андерсон]]. Энтони Андерсон не должен соответствовать, как и Сантони Андерсон.

Что мне не хватает?


person Rid Iculous    schedule 17.02.2013    source источник


Ответы (1)


Я думаю, что вы хотите использовать слово граница для соответствия, \b. Это включает в себя символы, не являющиеся словами, а также начало или конец строки:

/\bAnthony Anderson\b/i
person Explosion Pills    schedule 17.02.2013
comment
О, большое спасибо за это. Работает на 99% и кажется очень простым. Кажется, это не работает с разрывами строк или двойными пробелами? - person Rid Iculous; 17.02.2013
comment
Попробуйте использовать многострочный модификатор: php.net/manual/en/reference. pcre.pattern.modifiers.php -- я не уверен, что вы имеете в виду под двойными пробелами - person Explosion Pills; 17.02.2013
comment
Скобки @RidIculous не нужны, или можно использовать \s - person Explosion Pills; 17.02.2013
comment
спасибо, чувак, ты чемпион! Я действительно не делаю много регулярных выражений, как вы можете сказать... Как я могу принять ваш ответ? - person Rid Iculous; 17.02.2013
comment
@RidIculous нажмите на галочку под номером (возможно, вам придется подождать некоторое время из-за вашего представителя). Голоса тоже хороши - person Explosion Pills; 17.02.2013