Regex Php конвертирует скобки и фигурные скобки в такие ссылки, как StackOverflow Reddit

Я пытаюсь разобрать некоторую разметку, размещенную пользователем в текстовом поле, хранящемся в базе данных mysql, в ссылку, похожую на стиль Reddit и StackOverflow:

[foo](http://foo.com) = <a href="http://foo.com">foo</a> 

До сих пор я придумал это:

  if (stristr($text, '[') == TRUE && stristr($text, '](') == TRUE && stristr($text, ')') == TRUE && strpos($text, '[') == 0) { $text = substr($text, 0, strpos($text, ']')); $href_start = strpos($text, '('); $href = substr($title, $href_start, strpos($text, ')')); $text_array = array('[', ']'); $href_array = array('(', ')'); $href = str_replace($href_array, '', $href); $text_string = str_replace($text_array, '', $text_string); $text = '<a href="' . $href . '">' . $text_string . '</a>'; } 

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

 $title = '<a href="' . $href . '">' . substr($text, 0, 80) . '</a>'; 

Таким образом, бонусные баллы, если кто-то может сказать мне, как захватить переменную сумму текста во время выполнения этой операции с строкой. Я знаю о PHP Markdown, но я думал, что это будет излишним для того, что я пытаюсь сделать.

Solutions Collecting From Web of "Regex Php конвертирует скобки и фигурные скобки в такие ссылки, как StackOverflow Reddit"

 $string = <<<EOS some text [foo](http://foo.com) and more text [bar](http://bar.com) and then a [really looooooooooooooooooooooooooooooooooooooooooooooo00000000000000000ooong description](http://foobar.com) EOS; $string = preg_replace_callback( '~\[([^\]]+)\]\(([^)]+)\)~', function ($m) { return '<a href="'.$m[2].'">'.substr($m[1],0,80).'</a>'; }, $string ); echo $string; 

вывод:

 some text <a href="http://foo.com">foo</a> and more text <a href="http://bar.com">bar</a> and then a <a href="http://foobar.com">really looooooooooooooooooooooooooooooooooooooooooooooo00000000000000000ooong de</a> 

редактировать:

Я полагаю, вам не нужно использовать preg_replace_callback для этого – можно просто использовать preg_replace вместо этого, но мне нравится первое лучше, потому что регулярное выражение немного чище, и вы можете иметь немного больше контроля над построением своей ссылки. Но вот версия preg_replace :

 $string = preg_replace( '~\[([^\]]{1,80})[^\]]*\]\(([^)]+)\)~', '<a href="$2">$1</a>', $string ); 

Используйте это регулярное выражение:

 \[(.{1,80}).*?\]\((.+?)\) 

И замените его на:

 <a href="$2">$1</a> 

Вы можете использовать $1 за титул, разделив его на ' ' или ' ' либо получив его как есть.

Код:

 <?php $string = '[foo](http://nettpals.in)'; $pattern = '/\[(.{1,80}).*?\]\((.+?)\)/'; $replacement = '<a href="$2">$1</a>'; echo preg_replace($pattern, $replacement, $string); ?> 

Демо: http://ideone.com/xiAT6w