2017-04-23 153 views
1

上下文;preg_match_all提取部分字符串的最佳模式是什么?

•从URL的file_get_contents,我得到很多东西一样<item></item><url></url>

•我使用preg_match_all提取URL,标题等

例如:

$jStringToSubStract = '<a>stuffA</a><b>stuffB</b><url>http...</url>'; 
preg_match_all("#<url>(.*?)<\/url>#sx", $jStringToSubStract , $subItems, PREG_SET_ORDER); 
foreach ($subItems as $subItem ) {   
     if (strlen ($subItem[1]) > 0) { 
      echo $subItem[1]; // this is returning the http... INSIDE <url></url> 
     } 
} 

但它是了大量慢 ...

preg_match_all有更快的选择来提取部分字符串吗?

+0

他们从来没有学习:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

+0

@JazZ:simplehtmldom并不是那么简单,是基于正则表达式(用于信息)的很大部分,并且很慢。 PHP已经构建了DOMDocument和DOMXPath类,并且还有两种处理XML(sax和XMLReader)的方法。 –

+0

感谢您的来信@CasimiretHippolyte。删除我的评论。 – JazZ

回答

1

看到您发布的解决方案后,我现在明白您要实现的目标。既然你是只捕获在[attrname]=[attrvalue]格式(可以是单引号,双引号,或根本没有报价)子,这些优化模式你...

这人会得到所有的属性:\K\S+=["']?[^>"']+["']?>??Demo

这人会得到特定属性:\K(?:alt|title|src|href)=["']?[^>"']+["']?>??Demo

这些模式不使用捕捉组。这意味着您的代码将避免不必要的结果数组膨胀并以全字符串匹配的形式访问子字符串。这两种模式都会比您发布的模式更有效率。

我还应该提及,我的模式和模式都不是100%可靠的,因为没有检查这些子字符串是否在html标签中。这就是为什么强烈鼓励HTML解析程序的原因。如果您确定您要阅读的文字不会在标签外有任何自由浮动格式的字符串,那么结果将会很好。

+0

哇,谢谢,我会进一步看看,并尝试它 –

+0

有没有一种方式与正则表达式得到所有东西里面的= quot和= = DoubleQuot是这样的:' DESC 1 DESC 2 DESC 3 DESC 4 DESC 5 DESC 5 DESC 5 DESC 5',得到1个阵列ATT1,ATT2,ATT3,ATT4 –

+0

@JohnR让我特别要求拜托e我提供了一种模式...您想要捕获任何html标签内存在的所有单引号和双引号属性值。正确?你需要区分单打还是双打?或者他们都可以集中到一个捕获组中? – mickmackusa

0

FROM

$string=' 
<anytag aa="att1">DESC 1</anytag> 
<item aa="att2">DESC 2</item> 
<anytag bb="att3">DESC 3</anytag> 
<anytag cc="att4">DESC 4</anytag> 
<anytag src="att5">DESC 5</anytag> 
<anytag src="att6">DESC 6</anytag> 
<anytag src=\'att7\'>DESC 7</anytag> 
<anytag src=\'att8\'>DESC 8</anytag> 
<anytag href="att9" title="title1">DESC 9</anytag> 
<anytag blabla="att10">DESC 10</anytag> 
'; 

// this one will get ALL attributes 
preg_match_all("#\S+=[\"'](?:.(?![\"'] +\S+=|[>\"']))+.[\"']#sx", $string , $subItems); 
foreach ($subItems[0] as $subItem ) { echo $subItem.'<br>'; } 

// this one will get specific attributes 
$patterns = 'alt|title|src|href'; 
preg_match_all("#($patterns)=[>\"'](.*?)[>\"']#sx", $string , $subItems); 
foreach ($subItems[0] as $subItem ) { echo $subItem.'<br>'; } 
相关问题