Использование PHP Мне нужно, чтобы у меня был массив tag name => tag URL
мне нужно, чтобы как-то сканировать текстовый ввод (будет несколько большим, сообщение в блоге) и найти все теги в тексте и заменить их ссылкой на URL. Чтобы усложнить его, если имя тега находится внутри тегов <h1>
, <h2>
или <code> and <pre>
оно не будет делать этого. Возможно, чтобы упростить, я могу сказать, что он должен быть внутри <p>
для переключения.
Я не уверен, как это сделать, я знаю, что мне понадобится регулярное выражение, но я немного потерян в данный момент, если кто-нибудь может мне помочь, я бы очень признателен
поэтому PHP
тег будет превращен в <a href="link here">PHP</a>
Вы можете использовать синтаксический анализатор XML, например:
$array_of_tags = (array) simplexml_load_string($html);
ИЛИ
$xml_object = simplexml_load_string($html);
Первый подход даст вам теги в массиве, доступном для поиска. Второй даст вам объект SimpleXMLElement.
Затем вы можете использовать простой цикл foreach для итерации по элементам в вашем массиве или ссылки на переменные в объекте SimpleXMLElement. Взгляните на учебник simplexml_load_string от W3C, это очень просто.
Здесь достаточно простого цикла:
$post = 'My link to {tag1} is awesome, but not as awesome as my link to {tag2}'; $tags = array( 'tag1' => 'http://tag1.com', 'tag2' => 'http://tag2.com', 'tag3' => 'http://tag3.com', ); foreach ($tags as $tag_name => $tag_val) { $post = str_replace('{'.$tag_name.'}', "<a href='$tag_val'>$tag_name</a>", $post); } echo $post; // outputs: // My link to <a href='http://tag1.com'>tag1</a> is awesome, but not as awesome as my link to <a href='http://tag2.com'>tag2</a>
Я предполагаю, что вы исключили h1, h2, код и pre-теги не имеют гнездования, и если вы разберетесь на вставке, я бы сделал:
<(h1|h2|code|pre)>(.*?)</\1>
, заменяя их заполнителями и строгая их на массив как placeholder => html code
Definetly – не блестящее решение, но делая это только при вставке сообщения, это не должно быть так плохо.
Я бы не использовал регулярное выражение (и я не думаю, что вы это сделаете), но я думаю, вам просто нужно перейти к латуни. Выполняйте цикл foreach и сохраняйте логические значения, чтобы отслеживать, когда вы находитесь внутри <h1> <h2> <code> or <pre>
, если вы и находите что-то, что необходимо заменить, а затем не заменяйте его, иначе замени это. Имеет ли это смысл? Я могу получить более подробную информацию, если вы хотите. Но ответ Травеги лучший.