Заменете имената при пълнотекстово търсене, като игнорирате препинателните знаци и ги оставяте в такт. PHP & Regex

Опитвам се да заменя определени срещания на низове в текстов файл с връзки. Някои от обектите се състоят от повече от една дума, т.е. те са низове с интервали между тях. По същество търся регулярен израз, който отчита препинателните знаци и не е чувствителен към главни и малки букви. Изглежда, че моето „решение“ се върти в кръг и познанията ми за регулярен израз просто не са достатъчно добри за това :(

$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