PHP(正则表达式)未知单词与特殊。字符"pairs matching"



我不知道,如何使主题(标题)足够清晰易懂。我有这样的东西:

<h2>Title</h2>
<<navigation id="submenu">>
<<main level="1" asd="2">>
<<main level="1" asd="2">>
<<notmain>>asd<</notmain>>
<</navigation>>
<p><a href="..">asd</a>asdasdasd</p>
Oh no! The great rabbit is attacking us, and we are 
only knights of a square table!
<h2>Here another tag can occur</h2>
<<footer>>
<<copyright id="copy">>
<</footer>>

我必须找到并记住(作为文本)有两个标记的对象,而不是一个(但只有主父标记)。因此,对于这个例子,我需要输出这样的东西:

array(
0 => '<<navigation id="submenu">><<main level="1" asd="2">><<main level="1" asd="2">><<notmain>>asd<</notmain>><</navigation>>',
1 => '<<footer>><<copyright id="copy">><</footer>>';

空格、空格、制表符和休止符都无关紧要,因为使用trim和str_replace可以很容易地将其剥离。唯一的问题是搜索方法。

我试着用正则表达式来表示,但是没有什么问题。

  1. 我只对父母感兴趣。因此,内部没有递归搜索,只在具有'<lt;''>>'以及所有内部元素(不在乎它们看起来如何)
  2. 我没有任何关于第一个单词的数据。它可以是<>。然后全部返回:)。我不知道,也没有找到任何解决方案,如果regex能记住它找到了什么

我希望我的问题很清楚。

我很了解PHP,所以没有代码或想法的文本解决方案也会很有帮助。

如果有一个没有regex的解决方案,那就太好了。当然有一个残酷的解决方案,(一个字符接一个字符的分析),但它需要大量的代码。。。

这个怎么样:

%^<<([^<]+?)>>$(.+?)^<<([^<]+?)>>%sm

preg_match_all一起使用时给出此结果

array (
0 => 
array (
0 => '<<navigation id="submenu">>
<<main level="1" asd="2">>
<<main level="1" asd="2">>
<<notmain>>asd<</notmain>>
<</navigation>>',
1 => '<<footer>>
<<copyright id="copy">>
<</footer>>',
),
1 => 
array (
0 => 'navigation id="submenu"',
1 => 'footer',
),
2 => 
array (
0 => '
<<main level="1" asd="2">>
<<main level="1" asd="2">>
<<notmain>>asd<</notmain>>
',
1 => '
<<copyright id="copy">>
',
),
3 => 
array (
0 => '/navigation',
1 => '/footer',
),
)

最新更新