2012-09-11 35 views
0

我是一名初学者,并且遇到了使用RegExr工具发现的正则表达式的问题。使用正则表达式匹配PHP中的字符串

我从名为properties.xml中的XML文件,我在这里展示载一组分类广告的标题 -

<?xml version="1.0"?> 
<rss version="2.0"> 
    <channel> 
    <item> 
     <title>For Sale - Toaster Oven</title> 
    </item> 
    <item> 
     <title>For Sale - Sharp Scissors</title> 
    </item> 
<item> 
     <title>For Sale - Book Ends</title> 
    </item> 
<item> 
     <title>For Sale - Mouse Trap</title> 
    </item> 
<item> 
     <title>For Sale - Water Dispenser</title> 
    </item> 
    </channel> 
</rss> 

这里的,如果有哪个解析XML,然后检查PHP代码火柴;不幸的是它没有显示。

<?php 
$xml = simplexml_load_file("properties.xml"); 

foreach ($xml->channel->item as $item){ 
    $title = $item->title; 
    $myregex = preg_quote("/(?<=For(.)Sale(.)-(.))[^]+/"); 
    $result = preg_match($myregex, $title, $trim_title); 
    echo $result; 
} 
?> 

我已经核对过RegExr工具的正则表达式,它似乎很动听 - 这里有一个撷取画面

enter image description here

回答

1

你在你与[^]正则表达式错误。插入符号用于否定方括号中的匹配字符。例如[^a]将不匹配a。

你的正则表达式并不理想。如果你想匹配的是“出售”的字符串我只是用后

/出售无坚不摧 - ([^ <] +)/

+0

谢谢,但它也不起作用 - 根据需要选择整个字符串,而不是按照“For Sale - ”字符串出现的内容。这里是RegExr的屏幕截图 - http://i.imgur.com/ygszr.png –

+0

忘记RegExr中的内容或不匹配 - PHP只会为您提供捕获组(即括号)时所要求的内容。正如@ Maks3w指出,你可能需要访问节点的'text()'而不是节点本身。 –

-1

您可以使用XPath查询XML文件

$xml = simplexml_load_file("properties.xml"); 
$results = $xml->xpath('//title/text()'); 

static $myregex = '/For Sale - (.*)/'; 
while(list(, $title) = each($results)) { 
    $result = preg_match($myregex, $title, $trim_title); 
    $trim_title = $trim_title[1]; 
    echo $result; // Number of matches 
    echo $trim_title; 
} 

更简单的

while(list(, $title) = each($results)) { 
    echo substr($title, 11) . "\n"; 
} 
+0

问题是,旧的代码没有访问XML元素的文本() – Maks3w

+0

谢谢,但我试过运行这个,但echo $ result仍然返回一堆0不幸的。 –

+0

我更新了你的正则表达式现在应该可以工作 – Maks3w

-1

你可以试试这个

<?php 
$xml = simplexml_load_file("properties.xml"); 

foreach ($xml->channel->item as $item){ 
    preg_match("/For Sale(.*)<\/title>/siU", $item); 
    echo trim($item[1]," -"); 
} 
?> 
+0

你不需要处理结束标记,SimpleXML为你提供了足够的方法来访问文本 – Maks3w