【问题标题】:PHP replace characters except the HTML tagsPHP 替换 HTML 标签以外的字符
【发布时间】:2015-07-10 11:34:30
【问题描述】:

我需要将字符串中的字符0,1,2,...,9 替换为\xD9\xA0,\xD9\xA1,\xD9\xA2,...,\xD9\xA9。该字符串来自 CKEditor,因此它可能包含 html 标签。使用以下代码

$body = str_replace("1", "\xD9\xA1", $body);

它将每个1 替换为\xD9\xA1,因此它会影响标签<h1><table border="1">,而我只需要替换正文中的数字而不是标签。

包含数字的标签是<h0><h1><h2><h3><h4><h5><h6>cellspacingcellpaddingborder的table标签。

如何用上面的符号替换数字而不影响<h0><h1><h2><h3><h4><h5><h6>cellspacingcellpaddingborder

【问题讨论】:

  • 永远不要在 html 上使用正则表达式。你需要使用解析器stackoverflow.com/a/1732454/1916721
  • 您需要解析 HTML 并仅在 textnodes 上执行替换。
  • 我从未使用过任何解析器,如果您能提供更多详细信息,我将不胜感激
  • 非常感谢各位,我试试
  • 初学者请看 htmlparsing.com,或者这个问题stackoverflow.com/questions/3577641/…

标签: php regex string replace html-parsing


【解决方案1】:

您不应该使用正则表达式来处理 html,但是如果您仍想使用正则表达式,您可以将丢弃模式与正则表达式一起使用,如下所示:

<.*?>(*SKIP)(*FAIL)|1

Working demo

这个正则表达式背后的想法是跳过&lt;...&gt; 中的任何内容,但匹配其余内容。因此,它只会匹配不在 html 标记内的数字 1。再一次,我会改用 html 解析器。

php代码

$re = "/<.*?>(*SKIP)(*FAIL)|1/"; 
$str = "<h0><h1><h2><h3>\n<table border=\"1\">\n1\n"; 
$subst = "\xD9\xA1"; 

$result = preg_replace($re, $subst, $str);

【讨论】:

  • 非常感谢您的代码有效。我的网站基于 Drupal,所以如果我想使用解析器,我需要在 Drupal 上安装它的模块,它需要一些库,所以我想使用像你这样的简单代码会更有效。再次感谢
  • @Drupalist 很高兴为您提供帮助
猜你喜欢
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
相关资源
最近更新 更多