【问题标题】:Exclude closed HTML tags from string with regex使用正则表达式从字符串中排除封闭的 HTML 标记
【发布时间】:2017-04-03 17:15:07
【问题描述】:

我在 PHP 中遇到了 preg_replace() 的问题。

我从数据库中获取了一些未转义的 HTML 字符串,并使用 htmlentities() 转义了所有特殊字符。它工作得很好,但它也替换了<>symbols,所以我使用str_replace() 并替换了所有<>,所以这些标签被排除在替换之外。我使用的所有标签都是封闭的,但我使用了一些以<> 符号开头的内容,例如字符串<nome programma> 被视为标签。

所以我决定使用 preg_replace() 和这个正则表达式 <(\w+)>(.*)<\/(\w+)>

我必须转义那些字符串:

  • <sub>string</sub>
  • <code>start "<nome programma>":</code>
  • Il tipo <code>string</code> e il tipo <code>char</code>

这对前两种情况很有效,但对最后一种情况不太适用。

我写了一个例子here

有人可以帮我弄清楚吗?

【问题讨论】:

  • 我认为您正在寻找 htmlspecialcharshtmlentitieshtml_entity_decode [原文如此]。不要为此使用正则表达式!
  • htmlspecialchars() 太还原了...htmlentities() 替换了所有内容,所以我不得不使用正则表达式。
  • 我明白了。所以你得到了无效的 HTML,其内容看起来像标签(甚至可能是或成为标签),你正在尝试使用正则表达式来纠正它。顺便说一下,这些字符串是你从数据库中获得的那些吗?他们似乎已经逃脱了。

标签: php html regex special-characters


【解决方案1】:

我找到了解决办法!

工作的正则表达式是这个:((<)(\w+)(>))(.*?)((<)[\/+](\w+)(>))

我希望这可以帮助别人!

【讨论】:

  • 简单得多(实际上更准确):<(\w+)>(.*?)<\/(\w+)>。更好的是:<(\w+)>(.*?)<\/\1>(这样它只适用于匹配的结束标签)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2015-04-24
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多