正则表达式一次匹配多次出现

时间:2017-01-31 11:46:26

标签: php regex

我有这个字符串:

<table width="100%">
    <tr>
      <td width="80" valign="top">
        <b>wo  1 februari</b>
      </td>
      <td>
        <table width="100%">
          <tr class="spits-dagdeel spits-Ochtend">
            <td width="60" valign="top">
              <i>Ochtend</i>
            </td>
            <td>
              <p class="spits-2">lichte spits (2)
               </p>
              <p>De eerste dag van de nieuwe maand, woensdag. Tijdens de ochtend is het vaak rustig op de wegen en dat zal ook nu het geval zijn. We verwachten op het drukste moment niet meer dan 150 kilometer file op de snelwegen.</p>
              <p class="spits-klasse"> Bij een lichte spits wordt tot 150 km verwacht. De normale knelpunten hebben files.
  </p>
            </td>
          </tr>
          <tr class="spits-dagdeel spits-Avond">
            <td width="60" valign="top">
              <i>Avond</i>
            </td>
            <td>
              <p class="spits-3">reguliere spits (3)
               </p>
              <p>Deze spits iets meer drukte dan tijdens de ochtendspits, maar dat is vrij gebruikelijk. We verwachten geen bijzonderheden. Alleen bij ongelukken kunnen files snel in lengte toenemen.</p>
              <p class="spits-klasse"> Bij een reguliere spits wordt tot 225 km verwacht. Alle knelpunten hebben files.
  </p>
            </td>
          </tr>
        </table>
      </td>
    </tr>
  </table>

我想从字符串中捕获数据并使用正则表达式将其保存到我的数据库中。

我对输出的喜欢是这样的:

array (
    'date' => 'wo 1 februari',
    'partOfDay' => 'Ochtend',
    'intensity' => 'lichte spits (2)',
    'description' => 'De eerste dag van de nieuwe maand, woensdag. Tijdens de ochtend is het vaak rustig op de wegen en dat zal ook nu het geval zijn. We verwachten op het drukste moment niet meer dan 150 kilometer file op de snelwegen.',
    'default' => 'Bij een lichte spits wordt tot 150 km verwacht. De normale knelpunten hebben files.'
);

array (
    'date' => 'wo 1 februari',
    'partOfDay' => 'Avond',
    'intensity' => 'reguliere spits (3)',
    'description' => 'Deze spits iets meer drukte dan tijdens de ochtendspits, maar dat is vrij gebruikelijk. We verwachten geen bijzonderheden. Alleen bij ongelukken kunnen files snel in lengte toenemen.',
    'default' => 'Bij een reguliere spits wordt tot 225 km verwacht. Alle knelpunten hebben files.'
);

只有我不知道如何以最有效的方式做到这一点。

2 个答案:

答案 0 :(得分:0)

我认为正则表达式不是最佳选择:空白字符可以更改,网站管理员可以决定压缩html,在这些情况下,您需要重写整个正则表达式(这将是一个巨大的长期混乱)。

最好的举措是使用像Symfony DOM Crawler这样的DOM抓取工具。

与作曲家一起使用

创建一个空白的作曲家项目并需要dom抓取工具包:

composer init
composer require symfony/dom-crawler

PHP文件

require_once "vendor/autoload.php"

use Symfony\Component\DomCrawler\Crawler;

$html = <<<'HTML'
<!DOCTYPE html>
<html>
    <body>
        <p class="message">Hello World!</p>
        <p>Hello Crawler!</p>
    </body>
</html>
HTML;

$crawler = new Crawler($html);

foreach ($crawler as $domElement) {
    var_dump($domElement->nodeName);
}

P.s。:几个月前我有一个类似的任务,我尝试使用正则表达式,但过了一段时间后,我意识到这种工作的最佳工具是DOM Crawler

答案 1 :(得分:0)

如果你的表结构是固定的,你可以试试这个:

$dom = new domDocument();
$dom->loadHTML($text);//$text is your table
$dom->preserveWhiteSpace = false;
$tables = $dom->getElementsByTagName('table');
$table = $tables->item(1);
$keys=array('partOfDay','intensity','description','default');
$arr=array();
$dt=$tables->item(0);
$x=0;
foreach($dt->childNodes as $dates){
    foreach ($dates->childNodes as $k=>$data){
    $date=$data->nodeValue;break;
    }

}
foreach ($table->childNodes as $key=>$td) {
    $arr[$key]['date']=$date;
    $i=0;
    foreach ($td->childNodes as $k=>$data){
        if($data->hasChildNodes()){
            foreach($data->childNodes as $datum){
               if(!empty($datum->tagName)){
             if(strcmp($datum->tagName ,"p")==0 || strcmp($datum->tagName ,"i") == 0 ){
              $arr[$key][$keys[$i]]=$datum->nodeValue;
              $i++;
            }
               }
            }

        }

} 
}

DEMO HERE