1

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

细绳:

   <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 -->

4

2 回答 2

2

处理 (X)HTML/XML 字符串时经常出现的情况,这样做的正确方法是根本不使用正则表达式,而是使用DOMXPath

要获取文档中的所有注释,您需要的 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);

看到它工作

于 2012-10-11T08:37:27.800 回答
1

尝试

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

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

然后我通过在它后面添加一个来使量词变得不贪婪?,否则它将从第一个开始标记匹配到最后一个结束标记。

于 2012-10-11T08:31:09.877 回答