Использование регулярных выражений в preg replace для сопоставления тега привязки html href


Я пытаюсь использовать preg_replace для замены

<a href="WWW.ANYURL.COM">DISPLAY_TEXT</a>

С

<a href="WWW.ANYURL.COM">DISPLAY_TEXT</a>

Вот мой код:

$string = htmlentities(mysql_real_escape_string($string1)); 
$newString = preg_replace('#&lt;a href=&quot;([^&]*)&quot;&gt;([^&]*)&lt;/a&gt;#','<a href="$1">$2</a>',$string);

Если я выполняю ограниченные тесты, такие как:

$newString = preg_replace('#&lt;a href#','TEST',$string);

Затем

&lt;a href=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAYTEXT&lt;/a&gt;

Становится

TEST=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAYTEXT&lt;/a&gt;

Но если я попытаюсь заставить его также соответствовать"=", он будет действовать так, как будто он не может найти совпадение, т. е.

$newString = preg_replace('#&lt;a href=#','TEST',$string);

Возвращает оригинал без изменений:

&lt;a href=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAY_TEXT&lt;/a&gt;
Я занимаюсь этим уже пару часов, любая помощь была бы очень кстати. оцененный.

Редактировать: код в контексте

$title = clean_input($_POST['title']);
$story = clean_input($_POST['story']);

function clean_input($string) 
  { 
  if(get_magic_quotes_gpc())
  {
   $string = stripslashes($string);
  }
$string = htmlentities(mysql_real_escape_string($string)); 
$findValues = array("&lt;b&gt;","&lt;/b&gt;");
$newValues = array("<b>", "</b>");
$newString = str_replace($findValues, $newValues, $string);
$newString2 = preg_replace('#&lt;a href=&quot;([^&]*)&quot;&gt;([^&]*)&lt;/a&gt;#','<a href="$1">$2</a>',$newString);
return $newString2;
}

Образец $story = Lorem ipsum dolor sit amet, consectetur adipiscing elit. <a href="www.google.com">Google</a> Vivamus магазина ООО "Фелис". Morbi vitae neque ac neque blandit malesuada lobortis sit amet justo. Donec convallis, nibh ut lacinia tempor, neque felis scelerisque nibh, в feugiat lectus erat в нулле. В Эт euismod имеющий. <pernicious code></code>Pellentesque vitae ante orci, vitae ultrices neque. <a href="www.yahoo.com">Yahoo</a> In non nulla sapien, vestibulum faucibus metus. Fusce egestas viverra arcu, <b>ac</b> sagittis leo facilisis in. Nulla facilisi.

Я хочу, чтобы только несколько тегов, таких как href и bold, были допущены в качестве кода.

2 2

2 ответа:

Вам не нужно ничего заменять вручную. Если это вся входная строка, то используйте html_entity_decode() чтобы превратить побеги обратно в < и >.


Опять же, ваше регулярное выражение работает так, как и предполагалось с образцом текста.

Ваша проблема заключается в преждевременном mysql_real_escape_string() звони. Он добавляет обратные косые черты к двойным кавычкам " в вашем html, и именно поэтому обратное преобразование не удается (ваше регулярное выражение не готово к поиску \&quot;).

Избегайте этого. Избавиться от уродливых clean_string() hack и magic_quotes как рекомендовано руководством. Вы должны выполнить экранирование базы данных непосредственно перед вставкой в базу данных, не ранее. (Или еще лучше использовать более простой PDO с подготовленными утверждениями .)

Также избегайте дубликатов переменных $newString123, просто перепишите тот, который у вас уже есть при перезаписи строк.

Вы также можете сделать это следующим образом:

$str = "&lt;a href=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAY_TEXT&lt;/a&gt;";
echo "Your html code is thus: " . htmlspecialchars_decode($str);