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>

私の正規表現の試み:

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

これにより、1 行のコメントがすべて抽出されます。

質問:

すべてのコメントを取得するにはどうすればよいですか? マルチラインのものも?追加\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

デフォルトでは改行文字なしで一致するため、正規表現区切り文字の後にモードを.有効にする必要があります。(修飾子です。文字列全体を 1 行として扱います。つまり、ドットを改行にも一致させます。)dotallsssingleline

次に、 it の後に a を追加して量指定子を非貪欲にしました?。そうしないと、最初の開始タグから最後の終了タグまで一致します。

于 2012-10-11T08:31:09.877 に答える