Игла в стоге сена с массивом в PHP

Использование 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-теги не имеют гнездования, и если вы разберетесь на вставке, я бы сделал:

  1. preg_replace_callback с <(h1|h2|code|pre)>(.*?)</\1> , заменяя их заполнителями и строгая их на массив как placeholder => html code
  2. strtr для замены тегов
  3. strtr для замены заполнителей исходным кодом

Definetly – не блестящее решение, но делая это только при вставке сообщения, это не должно быть так плохо.

Я бы не использовал регулярное выражение (и я не думаю, что вы это сделаете), но я думаю, вам просто нужно перейти к латуни. Выполняйте цикл foreach и сохраняйте логические значения, чтобы отслеживать, когда вы находитесь внутри <h1> <h2> <code> or <pre> , если вы и находите что-то, что необходимо заменить, а затем не заменяйте его, иначе замени это. Имеет ли это смысл? Я могу получить более подробную информацию, если вы хотите. Но ответ Травеги лучший.