2

我正在尝试使用 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 是最佳的。也许这将是一次学习经历。

4

1 回答 1

1

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

要指定使用输入的分隔符,请使用 regex look arounds
这段代码完成了这项工作:

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

它使用前向打开标签进行拆分,使用后向查看结束标签。

查看此代码的实时演示,根据需要拆分您的示例。

于 2013-11-16T01:48:23.707 回答