Использование регулярных выражений в 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('#<a href="([^&]*)">([^&]*)</a>#','<a href="$1">$2</a>',$string);
Если я выполняю ограниченные тесты, такие как:
$newString = preg_replace('#<a href#','TEST',$string);
Затем
<a href="WWW.ANYURL.COM">DISPLAYTEXT</a>
Становится
TEST="WWW.ANYURL.COM">DISPLAYTEXT</a>
Но если я попытаюсь заставить его также соответствовать"=", он будет действовать так, как будто он не может найти совпадение, т. е.
$newString = preg_replace('#<a href=#','TEST',$string);
Возвращает оригинал без изменений:
<a href="WWW.ANYURL.COM">DISPLAY_TEXT</a>
Я занимаюсь этим уже пару часов, любая помощь была бы очень кстати. оцененный.
Редактировать: код в контексте
$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("<b>","</b>");
$newValues = array("<b>", "</b>");
$newString = str_replace($findValues, $newValues, $string);
$newString2 = preg_replace('#<a href="([^&]*)">([^&]*)</a>#','<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 ответа:
Вам не нужно ничего заменять вручную. Если это вся входная строка, то используйте
html_entity_decode()
чтобы превратить побеги обратно в<
и>
.
Опять же, ваше регулярное выражение работает так, как и предполагалось с образцом текста.
Ваша проблема заключается в преждевременном
mysql_real_escape_string()
звони. Он добавляет обратные косые черты к двойным кавычкам"
в вашем html, и именно поэтому обратное преобразование не удается (ваше регулярное выражение не готово к поиску\"
).Избегайте этого. Избавиться от уродливых
clean_string()
hack и magic_quotes как рекомендовано руководством. Вы должны выполнить экранирование базы данных непосредственно перед вставкой в базу данных, не ранее. (Или еще лучше использовать более простой PDO с подготовленными утверждениями .)Также избегайте дубликатов переменных
$newString123
, просто перепишите тот, который у вас уже есть при перезаписи строк.