【问题标题】:PHP Regex Match of Anchor Tag锚标记的PHP正则表达式匹配
【发布时间】:2013-11-27 16:39:09
【问题描述】:

我正在尝试使用 REGEX 在保持分隔符的同时拆分字符串。我希望通过锚标签拆分一个非常大且不可预测的字符串。我使用 HTML tidy 来确保标签是正确的,但是任何东西都可能出现在我希望匹配的锚标签之前或之后。

*PRECEDING-ANYTHING*<a *ANYTHING*>*ANYTHING*</a>*PROCEDING-ANYTHING*
*PRECEDING-ANYTHING*<a *ANYTHING*>*ANYTHING*</a>*PROCEDING-ANYTHING*

href URL 可以是任何东西,而诸如“目标”之类的附加属性也可以是任何东西。

我做了很多搜索和测试,要么我做错了,要么 Stack Overflow 上的其他答案不适用。

使用

$parts= preg_split($pattern, $textWithAnchors, -1, PREG_SPLIT_DELIM_CAPTURE) 

我希望 $parts 类似于以下内容。

parts[0] is equal to *PRECEDING-ANYTHING*
parts[1] is equal to <a *ANYTHING*>*ANYTHING*</a>
and so forth

正则表达式捕获整个锚标记以及其中的所有内容非常重要。

非常感谢任何帮助,我特意要求一个正则表达式,它可以在 PHP 中完成此任务。我知道有 HTML 解析器,但是在这种情况下使用 REGEX 是最佳的。不过,也许这将是一次学习经历。

【问题讨论】:

  • 请看DOMDocument 类,它更加实用并且支持加载部分代码。您可以轻松加载其中一行并让它找到所有a-tags。
  • 在这里查看第一个答案:stackoverflow.com/questions/1732348/…
  • 显示一些你尝试过的正则表达式。
  • 感谢 cmets。我已经对这些其他方法进行了大量阅读,目前据我所知,正则表达式仍然是完成这项任务的最佳方式。我之前已经看到使用 PHP 正则表达式成功完成了这种操作,并通过正则表达式完成了它。我知道这可能是一种肮脏的做法,但在这种情况下,这将是一次学习体验。另外,我想指出我上面使用的示例不仅仅是行,ANYTHING 文本可以是段落、其他 HTML、字符、换行符等。
  • 你真的不想为此使用正则表达式。但是这里是 /.*().*/i

标签: php html regex string split


【解决方案1】:

使用PREG_SPLIT_DELIM_CAPTURE 对您没有帮助,因为这会将在分隔符正则表达式的第 1 组中捕获的文本作为单独的元素返回,但您希望将分隔符包含 em> 与元素。

要指定使用输入的分隔符,请使用正则表达式环顾四周
这段代码完成了这项工作:

$parts= preg_split('/(?=<a)|(?<=\/a>)/', $textWithAnchors);

它对打开标签使用前瞻,对结束标签使用后视。

查看此代码的live demo,根据需要拆分您的示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    相关资源
    最近更新 更多