【问题标题】:Php Preg Match, how can i do this [closed]Php Preg Match,我该怎么做[关闭]
【发布时间】:2013-07-23 21:27:09
【问题描述】:
<td class=bilgi_satir width="45%"><b>( PLACE I WANT TO FETCH ) </b></td>

 ( OTHER HTML TAGS )

<td class=bilgi_satir width="25%"><b>( PLACE I WANT TO FETCH ) </b></td>

 ( OTHER HTML TAGS )

<td class=bilgi_satir width="35%"><b>( PLACE I WANT TO FETCH ) </b></td>

 ( OTHER HTML TAGS )

如何将它们提取到数组中?

宽度变量正在改变...

【问题讨论】:

  • @nick 我真的是 php 的菜鸟,你能发个例子吗?
  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php
  • 不要使用正则表达式。您最终只会听到(您或同事的)声音。请改用php.net/dom

标签: php regex


【解决方案1】:

尝试用正则表达式解决 HTML 问题,很快就会遇到两个问题。 但是如果你真的想用一个肮脏的正则表达式来做到这一点,它是可以做到的。你不应该依赖它。最简单的正则表达式是这样的:

preg_match_all(
    "/<td class=bilgi_satir width=\"..%\"><b>(.*)<\/b>/i",
    $your_html_here, $m
);

这将大致返回您想要的 print_r( $m[1] );(我添加了 1、2、3 来区分它们)

Array (
    [0] => ( PLACE I WANT TO FETCH 1 ) 
    [1] => ( PLACE I WANT TO FETCH 2 ) 
    [2] => ( PLACE I WANT TO FETCH 3 ) 
)

最好的方法是使用 DOM 解析。例如:

$doc = new DOMDocument();
$doc->loadHTML( $your_html_here );
$x = new DOMXPath( $doc );
$results = $x->query("//td[@class='bilgi_satir']//b");

# $results->length now shows 3

$ret = array();
foreach( $results as $count => $result ) {
    printf( "item # %s = %s\n", $count, $result->nodeValue ); # debug only
    $ret[] = $result->nodeValue;
}

这将显示:

item # 0 = ( PLACE I WANT TO FETCH 1) 
item # 1 = ( PLACE I WANT TO FETCH 2) 
item # 2 = ( PLACE I WANT TO FETCH 3) 

编辑:显然,将节点值转储到数组中可以让您根据需要通过数组访问。

【讨论】:

  • 你是我的英雄。我真的很喜欢第二个例子。真的谢谢...
猜你喜欢
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-16
  • 2014-02-28
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
相关资源
最近更新 更多