PHP正则表达式换行符

时间:2012-10-11 08:27:23

标签: php regex line-breaks

使用换行符提取评论的简单正则表达式问题:

字符串:

   <description language="de">Diese Tabelle zeigt die Zugangswege der Besucher auf die Website</description>

   <options>
      <!-- Hier stehen die Optionen für den View, die sich nicht auf colums beziehen.
           Bisher gibt es da nix, kann aber mal nicht schaden das vorzusehen  -->
   </options>


   <defaultcolumn>
      <!-- Hier können für Basiswerte für alle Spalten definiert werden. 
           Die Spaltendefinition weiter unten gibt die Möglichkeit die Werte je Spalte zu überschreiben
           Welche Optionen es gibt (incl. Titel, Description und Emptycelltext) siehe "allvaluescolumn" oben. 
      -->
      <options>
         <option name="align" value="left"><!-- (left|center|right), default left --></option>

我的正则表达式尝试:

/<!--(.*)-->/

这会提取所有单行注释。

问题:

如何获得所有评论?还有多线的?添加\n\r\n\未成功。

<!-- get me (linebreak) me also -->

2 个答案:

答案 0 :(得分:2)

执行此操作的正确的方式,就像处理(X)HTML / XML字符串时经常出现的情况一样,根本不使用正则表达式,而是使用{{3 }和DOM

要获取文档中的所有注释,您需要的XPath查询是:

//comment()

例如:

$str = '<description language="de">Diese Tabelle zeigt die Zugangswege der Besucher auf die Website</description>

<options>
  <!-- Hier stehen die Optionen für den View, die sich nicht auf colums beziehen.
       Bisher gibt es da nix, kann aber mal nicht schaden das vorzusehen  -->
</options>


<defaultcolumn>
  <!-- Hier können für Basiswerte für alle Spalten definiert werden. 
       Die Spaltendefinition weiter unten gibt die Möglichkeit die Werte je Spalte zu überschreiben
       Welche Optionen es gibt (incl. Titel, Description und Emptycelltext) siehe "allvaluescolumn" oben. 
  -->
  <options>
     <option name="align" value="left"><!-- (left|center|right), default left --></option>';

$doc = new DOMDocument('1.0');
@$doc->loadHTML($str);
$xpath = new DOMXPath($doc);

$nodes = $xpath->query('//comment()');

$comments = array();

foreach ($nodes as $node) {
    $comments[] = trim($node->nodeValue);
}

print_r($comments);

XPath

答案 1 :(得分:1)

尝试

/<!--(.*?)-->/s

.匹配默认情况下没有换行符,因此您需要在正则表达式分隔符后使用dotall启用s模式。 (ssingleline修饰符,它将整个字符串视为一行,即使点匹配也是换行符。)

然后我通过在?之后添加{{1}}来使量词不合理,否则它将从第一个开始标记到最后一个结束标记匹配。