У меня есть два регулярных выражения на пути моего ввода:
// replace a URL with a link which is like this pattern: [LinkName](LinkAddress) $str= preg_replace("/\[([^][]*)]\(([^()]*)\)/", "<a href='$2' target='_blank'>$1</a>", $str); // replace a regular URL with a link $str = preg_replace("/(\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|])/i","<a href=\"$1\" target=\"_blank\">untitled</a>", $str);
Теперь возникает проблема (как-то столкновение) . Для обычных URL-адресов все в порядке. Но для URL-адресов, основанных на шаблонах, возникает проблема: первое регулярное выражение создает ссылку этого, а второе регулярное выражение снова создает ссылку на его значение href
-attribute.
Как я могу это исправить?
Изменить: Согласно комментариям, как я могу создать одно регулярное выражение вместо двух регулярных выражений? (используя preg_replace_callback
) . Честно говоря, я попробовал, но он не работает ни для каких URL.
Объединяет ли они их? Потому что выход из них не идентичен. Первая имеет LinkName, а вторая имеет постоянную строку untitled
как LinkName.
$str = preg_replace_callback('/\[([^][]*)]\(([^()]*)\)|(\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|])/i', function($matches) { if(isset($matches[3])) { // replace a regular URL with a link return "<a href='".$matches[3]."' target='_blank'>untitled</a>"; } else { // replace a URL with a link which is like this pattern: [LinkName](LinkAddress) return "<a href=".$matches[2]." target='_blank'>".$matches[1]."</a>"; } }, $str); echo $str;
Один из способов – сделать это так. Вы объединяете два выражения вместе с альтернативным символом |
, Затем в вашей функции обратного вызова вы проверяете, установлена ли ваша третья группа захвата ( isset($matches[3])
), и если да, то второе регулярное выражение соответствует строке и вы заменяете обычную ссылку, иначе вы заменяете ссылкой / LinkText.
Надеюсь, вы все понимаете, и я могу вам помочь.