2013-11-14 20 views
2

我试图使用REGEX在保持分隔符的同时拆分一个字符串。我希望通过锚标签拆分非常大且不可预知的字符串。我使用HTML tidy来确保标签是正确的,但是任何可能在我希望匹配的锚标签之前或之后出现。PHP正则表达式匹配的定位标记

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

其中href网址可以是任何东西,其他属性(如'target')也可以是任何东西。

我做了很多搜索和测试,或者我做错了什么,或者堆栈溢出的其他答案不适用。

使用

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

我希望有$部分是类似于以下。

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

正则表达式捕获整个锚标记和其中的一切都很重要。

我非常感谢任何帮助,我特别要求一个能够在PHP中完成此操作的正则表达式。我知道有HTML解析器,但在这种情况下使用REGEX是最佳选择。虽然这可能是一种学习体验。

+3

请看'DOMDocument'类,它更实用,并支持加载部分代码。你可以轻松地加载你的一行,并让它找到所有'a'-tags。 –

+0

查看这里的第一个答案:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

显示你试过的一些正则表达式。 –

回答

1

使用PREG_SPLIT_DELIM_CAPTURE不会帮你,因为它返回的分隔符正则表达式的1组捕获为单独的元素文本,但你想要的分隔符是包括随份子。

要指定定界符消耗输入,使用正则表达式看变通
此代码的工作:

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

这是用前瞻的开放标签,一个大的外观背后的结束标记分裂。

请参阅此代码的live demo根据需要拆分您的示例。