2009-11-07 39 views
1

需要正则表达式的帮助。我正在尝试使用正则表达式,并且preg_match_all找到块<character>...</character>。这里是我的数据看起来像:正则表达式寻找<character>标签

<character> 
杜塞尔多夫 
杜塞爾多夫 
    <div class="hp">dùsàiěrduōfū<div class="hp">dkfjdkfj</div></div> 
    <div class="tr"><span class="green"><i>г.</i></span> Duesseldorf (<i>Deutschland</i>)</div> 
    <div class="tr"></div> 
</character> 

<character> 
    我, 是谁 
    <div class="hp">текст</div> 
    <div class="tr">some text in different languages</div> 
</character> 

我试图\<character\>.*\<\/character>但遗憾的是它没有工作。有什么建议么?

+0

你是什么意思“没有工作”?你没有得到比赛或错误的比赛吗? – 2009-11-07 23:43:31

+4

Regex是处理XML的不好选择。使用XML解析器,您的任务变得非常简单。 – bobince 2009-11-08 00:08:46

回答

3

如果使用preg家庭的功能,正则表达式应该是:

/\<character>(.*?)\<\/character>/s 

非贪婪的运营商?会阻止你只得到一个从第一<character>开始比赛,并结束在最后</character>/s标志将允许您的点匹配换行符。

+0

'<'不需要转义。 – 2009-11-08 11:11:22

2

尝试

<character>(.*?)<\/character> 

问号是ungreedy预选赛,这意味着它会匹配字符串尽可能短。另外<和>不需要转义。

+0

我只是想说一样的,但我已经丢失了我很容易找到的示例源代码。 ))) – 2009-11-07 23:46:18

5

除非你需要在枪点使用正则表达式来做到这一点,DOMDocument将会更加准确。

<?php 

$dom = new DOMDocument; 
$dom->loadXML($data); 

$character_nodes = $dom->getElementsByTagName('character'); 

// use $character_nodes... 
?> 
+0

甚至在枪口有没有很好的理由使用正则表达式来解析XML,但它仍然可能的数据只是看起来像XML,但不是很有效的XML ... – Kris 2009-11-08 00:45:24

+1

@Kris,我认为“没有被枪杀”仍然是一个在枪口下做某事的好理由。 ;) – 2009-11-08 01:04:33

+0

+1给出正确的答案。也有用于HTML的DOM解析器。对于其他任务,RegEx是一个很好的工具。 – TrueWill 2009-11-08 02:51:16