Я пытаюсь разобрать некоторую разметку, размещенную пользователем в текстовом поле, хранящемся в базе данных 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, но я думал, что это будет излишним для того, что я пытаюсь сделать.
$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