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

I don't know, how to make the subject (title) clear enough to understand. I've got something like this:

<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>>

I must find and remember (as text) objects that have two tags not one (but only the main parent). So for this example I need to output something like this:

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>>';

Spaces and white spaces, and tabs, and rest doesn't matter, as it is easy to strip it by using trim, and str_replace. The only problem is searching method.

I was trying to regex this but there are few problems.

  1. I'm interested in parents only. So no recursive searching inside, just outside element with '<<' '>>'and all the inside elements (don't care how they look).
  2. I haven't got any data of how the first word looks. It can be <>. And then return all :). I don't know, and haven't found any solution if regex can remember what it has found.

I hope that my question is clear.

I know PHP (quite well) so text solution without code, or idea will be also helpful.

If there exists a solution without regex, it will be great. There is of course a bruteforce solution, (character after character analyzing) but it needs tons of code...

doujiaoben28596
doujiaoben28596 但他删除了它:(。哦......甚至没有把答案抓到剪贴板中。
6 年多之前 回复
doutan3463
doutan3463 然后瓦西里的回答应该完成任务。聂玛扎公司]
6 年多之前 回复
dtrhd2850
dtrhd2850 好。所以我将重写一个模块,然后就不可能:)。所以没有“父母中的同一个孩子,父母中的父母一样,同一个标签中的相同标签中没有相同的标签,等等.PS.DziÄ™kizapomoc:)。
6 年多之前 回复
douhan4812
douhan4812 如果可能的话,它不是常规语言。您需要读取所有输入数据,识别并保持堆栈上的匹配标记。
6 年多之前 回复
dpiz9879
dpiz9879 不要这么认为......但最好还是考虑一下:)。+1。谢谢所有的回复和答案。我真的有一个问题需要接受。因为它们都带来了新的和有用的东西。
6 年多之前 回复
dpp66953
dpp66953 这种情况是可能的(嵌套标签也是主标签):xxxx<<a>><<b>><<a>>xxxx<</a>><</b>><</a>>XXXX?
6 年多之前 回复
dongle2627
dongle2627 您可以在正则表达式中使用反向引用。
6 年多之前 回复

1个回答

How about this one:

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

Gives this result when used with 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',
  ),
)
dongwen4487
dongwen4487 好的,还有一个小问题。 使用preg_match_all时遇到问题...它没有给我任何结果。 不应该'''是'\ <'例如? 我将尝试自己理解并纠正它:)。 这是最好的学习方式。
6 年多之前 回复
dongu189744321158
dongu189744321158 :) Ant这是一个未来的最佳解决方案,因为这个数组的其他元素也指向一些明智的东西:)。 大! 多谢!
6 年多之前 回复
duanqiao1926
duanqiao1926 乐于帮助 :)
6 年多之前 回复
dongyinshua9996
dongyinshua9996 那个答案听起来真的很棒:)。 我正在等待上面发布的其他一些评论,我可能会接受它;)。 感谢这个想法。 直到接受时间,+1来自我。
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐