2013-03-20 72 views
1

大家好,我正在使用正则表达式,并且在内容中有空格或换行符时无法使其正常工作。PHP和preg_match_all的正则表达式问题

$content = "<dt><span>Name:</span></dt> 
         <dd> 
         John 
         </dd> 
         <dt><span>Age:</span></dt> 
         <dd> 
         40 
         </dd> 
         <dt><span>Sex:</span></dt> 
         <dd> 
         Male 
         </dd>"; 

我使用的正则表达式是

preg_match_all('/<dt><span>(.*)<\/span><\/dt><dd>(.*)<\/dd>/',$content, $output); 
+5

你应该为此使用DOM解析器,而不是正则表达式。 – 2013-03-20 18:34:24

+0

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags#answer-1732454 – webbiedave 2013-03-20 18:36:47

+0

你可以在标签之间添加'[\ h \ v] *'该模式 – 2013-03-20 18:37:40

回答

2

不要用正则表达式解析HTML。使用DOM。这里有一个例子,如果你确信HTML结构是可行的。

$dom = new DOMDocument(); 
@$dom->loadHTML($content); 
$xpath = new DOMXPath($dom); 
$spans = $xpath->query('//span'); 
$dds= $xpath->query('//dd'); 
for ($i = 0; $i < $spans->length; $i++) 
{ 
    echo $spans->item($i)->nodeValue . $dds->item($i)->nodeValue . '<br>'; 
} 

如果你不确定它的结构,你需要一些更复杂的东西。

0

同意,你应该使用DOM。但是你不采取空白的账户之间

尝试:

preg_match_all('/<dt><span>(.*)<\/span><\/dt>.*<dd>(.*)<\/dd>/',$content, $output);