Как предотвратить повторное замещение вторым регулярным выражением?

У меня есть два регулярных выражения на пути моего ввода:

// 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.

Надеюсь, вы все понимаете, и я могу вам помочь.