Ошибка экранирования кавычек в регулярных выражениях в PHP - PullRequest
0 голосов
/ 09 января 2012

Я новичок в PHP и пытаюсь заменить шаблон URL на google.com в приведенном ниже коде.

    $textStr = "Test string contains http://foo.com/more_(than)_one_(parens)
http://foo.com/blah_(wikipedia)#cite-1
http://foo.com/blah_(wikipedia)_blah#cite-1
http://foo.com/unicode_(?)_in_parens
http://foo.com/(something)?after=parens
more urls foo.ca/me some other text";

$pattern = '(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)((?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))*)';

$textStr = preg_replace($pattern, "google.com", $textStr); 

echo $textStr;

Я нашел шаблон регулярного выражения в http://daringfireball.net/2010/07/improved_regex_for_matching_urls, но мне не удалось избежать одинарных кавычек, двойных кавычек в шаблоне успешно.

В настоящее время я получаю сообщение - Предупреждение: preg_replace () Неизвестный модификатор '\' Но я использовал косую черту () для экранирования одинарных кавычек в {};: \ '"

Может кто-нибудь помочь мне с кодом выше?

Ответы [ 2 ]

1 голос
/ 09 января 2012

Во-первых, для preg_replace необходимо разделить ваше регулярное выражение на /, например:

/\b((?:https: ... etc etc)/

Во-вторых, поскольку вы разделяете свои регулярные выражения с помощью /, вы должны экранировать любые / с обратной косой чертой. Итак https:// -> https:\/\/.

В-третьих, ваши модификаторы (?i) идут после косой черты:

`/\b((?:https: .. etc etc)/i`

Try (изменения сделаны: экранировано /, перенесено регулярное выражение из (?i)regex в /regex/i):

$pattern = '/\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)((?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))*)/i';
$textStr = preg_replace($pattern, "google.com", $textStr); 

echo $textStr;

Теперь, поскольку $pattern соответствует всему URL, вы просто получите:

"Test string contains google.com
google.com
google.com
google.com
google.com
more urls google.com some other text"

В общем, я рекомендую либо ответ @ Ampere (но он имеет более слабое регулярное выражение, чем ваш оригинал), либо использовать захватные скобки и обратные ссылки, чтобы сделать что-то вроде preg_replace($pattern,'google.com/\2',$textStr) (но измените соответствующие захватные скобки, так как это будет не работает с вашей текущей схемой захвата).

Этот сайт полезен для тестирования.

1 голос
/ 09 января 2012
$patterrn='/([wW]{3,3}\.|)[A-Za-z0-9]+?\./';
$text="Test string contains http://foo.com/more_(than)_one_(parens)
http://foo.com/blah_(wikipedia)#cite-1
http://foo.com/blah_(wikipedia)_blah#cite-1
http://foo.com/unicode_(?)_in_parens
http://foo.com/(something)?after=parens
more urls foo.ca/me some other text";
$output = preg_replace($patterrn,"abc.",$text);
print_r($output);

вывод будет,

Test string contains http://abc.com/more_(than)_one_(parens) http://abc.com/blah_(wikipedia)#cite-1 http://abc.com/blah_(wikipedia)_blah#cite-1 http://abc.com/unicode_(?)_in_parens http://abc.com/(something)?after=parens more urls abc.ca/me some other text
...