PHP(正则表达式)特殊的未知单词。字符“对匹配”

时间:2014-02-19 13:00:53

标签: php regex 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;&lt;'之外的元素之外'&gt;&gt;'以及所有内部元素(不关心它们的外观)。
  2. 我没有得到第一个字看起来如何的数据。它可以是&lt;&gt;。然后返回所有:)。我不知道,如果正则表达式能够记住它所发现的内容,那么就没有找到任何解决方案。
  3. 我希望我的问题很明确。

    我知道PHP(相当不错)所以没有代码或想法的文本解决方案也会有所帮助。

    如果存在没有正则表达式的解决方案,它会很棒。当然有一个暴力解决方案,(字符分析后的字符),但它需要大量的代码......

1 个答案:

答案 0 :(得分:1)

这个怎么样:

%^<<([^<]+?)>>$(.+?)^<<([^<]+?)>>%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',
  ),
)