【问题标题】:Using regex in preg_replace to match an html href anchor tag在 preg_replace 中使用正则表达式来匹配 html href 锚标记
【发布时间】:2011-09-21 12:27:16
【问题描述】:

我正在尝试使用 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。 &lt;a href="www.google.com"&gt;Google&lt;/a&gt; Vivamus quis sem felis。 Morbi vitae neque ac neque blandit malesuada lobortis 坐在 amet justo。 Donec convallis, nibh ut lacinia tempor, neque felis scelerisque nibh, at feugiat lectus erat in nulla。在等 euismod nunc。 &lt;pernicious code&gt;&lt;/code&gt;Pellentesque vitae ante orci, vitae ultrices neque。 &lt;a href="www.yahoo.com"&gt;Yahoo&lt;/a&gt; 在 non nulla sapien,前庭 faucibus metus。 Fusce egestas viverra arcu, &lt;b&gt;ac&lt;/b&gt; sagittis leo facilisis in. Nulla facilisi。

我希望只允许像 href 和粗体这样的几个标签作为代码通过。

【问题讨论】:

  • 呃...嗯..还有其他人看到这个问题的逻辑问题吗?
  • 等等——你想做什么?如果您只想撤消 htmlentities 的工作,为什么还要使用 htmlentities
  • 大多数人会使用html_entity_decode(),然后继续处理更重要的事情......
  • 我不知道你想要达到什么,但也许strip_tags($str, '&lt;a&gt;') 给你一个正确的结果而不是htmlentities()
  • 我只想撤消某些标签上的工作。我正在尝试清理要添加到数据库的字符串,但允许某些安全的 html 标记。

标签: php html regex preg-replace


【解决方案1】:

您无需手动替换任何内容。如果这是您的整个输入字符串,则使用html_entity_decode() 将转义符转回&lt;&gt;


同样,您的正则表达式与示例文本一样工作。

您的问题是过早的mysql_real_escape_string() 调用。它会在你的 html 中的 " 双引号中添加反斜杠,这就是反向转换失败的原因(你的正则表达式没有准备好查找 \&amp;quot;)。

避免这种情况。摆脱丑陋的clean_string() hack 和 ma​​gic_quotes 作为advised by the manual。您必须插入数据库之前进行数据库转义,而不是更早。 (或者更好的是使用更简单的PDO with prepared statements。)

还要避免$newString123 变量重复,只需在重写字符串时覆盖您已有的变量即可。

【讨论】:

  • 这不是我的整个输入字符串
  • 那么你的第一个完整的preg_replace有什么问题呢?
  • 代码确实有效。我试了一下。请准确地回答您的问题。
  • 你试过 $newString = preg_replace('#<a\ href="([^&]*)">([^&]*)</a>#' ,'$2',$string);成功了吗?
  • 好吧,如果是这样的话,那么一些非常奇怪的事情正在发生。我尝试了整个事情,它并没有取代任何东西,如果我尝试其中的部分,除非我包含等号(参见原始帖子),否则它们都可以工作。我正在运行一个 wamp 堆栈,我们正在运行的某些差异是否会导致我的失败?
【解决方案2】:

你也可以这样做:

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

【讨论】:

  • 那很好,因为这是我的整个字符串,但我希望能够使用任何可能的标记变化的几段并仅匹配 hrefs
猜你喜欢
  • 2017-10-04
  • 2011-04-19
  • 2013-11-27
  • 2022-01-05
  • 2023-03-27
  • 2012-04-02
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多