我正在尝试使用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悲哀坐amet,consectetur adipiscing elit。<a href="www.google.com">Google</a>
Vivamus quis sem felis。这是一个很好的例子。Donec convallis,nibh ut lacinia tempor,neque felis scelerisque nibh,在nulla的feugiat lectus erat。在欧洲。<pernicious code></code>
Pellentsque vitae ante orci,vitae ultrices neque。<a href="www.yahoo.com">Yahoo</a>
在非nulla sapien,前庭动物群metus。Fusce egestas viverra arcu,<b>ac</b>
sagittis leo facilisis in。Nulla facilisi。
我只想让href和bold这样的几个标签作为代码通过。
您不需要手动替换任何内容。如果这是整个输入字符串,那么使用html_entity_decode()
将转义转换回<
和>
。
同样,正则表达式与示例文本一起正常工作。
您的问题是过早的mysql_real_escape_string()
呼叫。它在html中的"
双引号中添加了反斜杠,这就是反向转换失败的原因(regex没有准备好查找'"
)。
避免这种情况。按照手册的建议,去掉丑陋的clean_string()
破解和magic_quotes。必须在插入数据库之前执行数据库转义,而不是更早。(或者更好地使用更简单的PDO和准备好的语句。)
还要避免$newString123
变量重复,只需在重写字符串时覆盖已有的变量即可。
您也可以这样做:
$str = "<a href="WWW.ANYURL.COM">DISPLAY_TEXT</a>";
echo "Your html code is thus: " . htmlspecialchars_decode($str);