PHP регулярное выражение для замены ссылок - PullRequest
1 голос
/ 28 ноября 2011

У меня есть это регулярное выражение замены (взято из исходного кода phpbb).

$match = array(
                '#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+" )?href="(.*?)" target\=\"_blank\">.*?</a><!\-\- \1 \-\->#',
                '#<!\-\- .*? \-\->#s',
                '#<.*?>#s',
            );
$replace = array( '\2',  '', '');

$message = preg_replace($match, $replace, $message);

Если я пропущу его через такое сообщение

asdfafdsfdfdsfds
<!-- m --><a class="postlink" href="http://website.com/link-is-looooooong.txt">http://website.com/link ... oooong.txt</a><!-- m -->
asdfafdsfdfdsfds4324

Возвращает

asdfafdsfdfdsfds
http://website.com/link ... oooong.txt
asdfafdsfdfdsfds4324

Однако я бы хотел превратить его в функцию замены.Так что я могу заменить заголовок ссылки в блоке, указав href.

Я хочу указать URL, новый URL и новый заголовок.Так что я могу запустить регулярное выражение с этими переменными.

$url = 'http://website.com/link-is-looooooong.txt';
$new_title = 'hello';
$new_url = 'http://otherwebsite.com/';

И оно вернуло бы то же самое необработанное сообщение, но с измененной ссылкой.

<!-- m --><a class="postlink" href="http://otherwebsite.com/">hello</a><!-- m -->

Я пытался настроить его как-то так, но не могу сделать это правильно,Я не знаю, как создать соответствующий результат, чтобы после замены он имел тот же формат.

$message = preg_replace('#<!\-\- ([mw]) \-\-><a (?:class="[\w-]+" )?href="'.preg_quote($url).'" target\=\"_blank\">(.*?)</a><!\-\- \1 \-\->#', $replace, $message);

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Вы обнаружите, что синтаксический анализ HTML с помощью регулярных выражений может быть болезненным и очень сложным. Лучше всего использовать синтаксический анализатор DOM , например , и вместо этого модифицировать ссылки.

0 голосов
/ 28 ноября 2011

Вам нужно также поймать другие части в группах, а затем использовать их при замене. попробуйте что-то вроде этого:

$replace = '\1http://otherwebsite.com/\3hello\4';
$reg = '#(<!-- ([mw]) --><a (?:class="[\w-]+" )?href=")'.preg_quote($url).'("(?: target="_blank")?>).*?(</a><!-- \2 -->)#';
$message = preg_replace($reg, $replace, $message);

См. здесь .

...