3
$pee = preg_replace( '|<p>|', "$1<p>", $pee );

この正規表現は、Wordpress ソース コード (formatting.php、wpautop 関数) からのものです。私はそれが何をするのかわからない、誰でも助けることができますか?

実際、私はこの関数を Python に移植しようとしています...誰かが既存のポートを既に知っているなら、私は正規表現が本当に苦手なので、それははるかに良いでしょう。

4

8 に答える 8

3

preg_replace() 関数では、やや紛らわしいことに、正規表現の標準の「/」以外の区切り文字を使用できます。

"|<p>|"

ちょうど一致する正規表現になります

"<p>" 

テキストで。ただし、の置換パラメーターが何であるかは明確ではありません

"$1<p>" 

$1 にマップするグループ化がないためです。与えられたように見えるかもしれませんが、これは段落タグを空の文字列に置き換え、その後に段落タグを付けただけで、実際には何もしていません。

PHP の癖についてより深い知識を持っている人は、より良い分析ができますか?

于 2008-12-08T16:31:25.740 に答える
2

...?

<p>実際、これは最初のタグを取り、前の正規表現の最初の一致を前に追加するように見えます(これには一致がないため)。

ただし、 preg_* 関数が $1 を独自の値で上書きしないという保証はないため、この動作は控えめに言っても悪いようです。

編集:ジェイのコメントから判断すると、この正規表現は実際には何もしません。

于 2008-12-08T16:15:07.973 に答える
2

wordpress は本当に変数「pee」を呼び出しますか?

$1 が何を表しているのかわからない (最初のパラメーターに中かっこがない?) ため、実際には何もしないと思いますが、間違っている可能性があります。

于 2008-12-08T16:15:44.477 に答える
2

この場合のパイプ記号|には、「これまたはあれと一致する」というデフォルトの意味はありませんが、より一般的なスラッシュの代わりにパターンの代替区切り文字として使用されます//これらの外観をエスケープせずにfor を照合したい場合(たとえば/(.\*)\/(.\*)\//、 は ほど読みにくい#/(.\*)/(.\*)/#)、これは理にかなっています。|ただし、パターン用に予約された別の文字である代わりに使用するのは、かなり逆効果のようです。

通常$1、置換パターンでは、括弧で示された最初のグループと一致する必要があります。たとえば、次のようなパターンがある場合

"(.*)<p>"

$0一致全体と$1の前の部分が含まれます&lt;p&gt;

指定された正規表現はグループを宣言しておら$1ず、他の場所で定義された (PHP4 の) 変数の有効な名前ではないため、この呼び出しは?の出現&lt;p&gt;を置き換えているようです。&lt;p&gt;

正直なところ、今は私もかなり混乱しています。推測:指定された行の前に呼び出される別のパターンマッチングメソッド(preg_matchなど)を取得して、$1そこから「リーク」しますか?

于 2008-12-08T17:05:47.513 に答える
0

その行は何もしないと思います。

価値があるのは、これが $1 が設定されている前の行です。

$pee = preg_replace('!<p>([^<]+)\s*?(</(?:div|address|form)[^>]*>)!', "<p>$1</p>$2", $pee);

しかし、それは何の価値もないと思います。私のテストでは、$1 は $1 に独自の値を設定していなくても、ある preg_replace から次の preg_replace まで値を維持しません。PHP 変数名は数字で始めることはできないので ( http://php.net/language.variablesを参照)、$1 は PHP 変数ではないことに注意してください。これは、単一の preg_replace 内で何かを意味するだけであり、この場合、preg_replace のルールは、何も意味しないことを示唆しています。

とはいえ、 autop が非常に広く使用されている関数であるということは、この行が何もしていないという私自身の結論に疑問を抱かせます。だから私は誰かが私を修正するのを楽しみにしています。

于 2008-12-08T20:39:56.723 に答える
0

正規表現は単にリテラル テキストと一致します

. スラッシュの代わりに垂直バーで正規表現を区切るという選択は、非常に残念です。コードは変更されませんが、人間が読みにくくなります。(また、正規表現で代替演算子を使用できなくなります。)

$1 は PHP では有効な変数名ではないため、二重引用符で囲まれた文字列で $1 が補間されることはありません。$1 は変更されずに preg_replace に渡されます。preg_replace は置換文字列を解析し、$1 を最初のキャプチャ グループの内容に置き換えます。キャプチャ グループがない場合、$1 は何も置き換えられません。

したがって、このコードは次と同じことを行います。

$pee = preg_replace( '/<p>/', "<p>", $pee );

これが何もしないというのは正しくありません。検索と置換が実行され、ソフトウェアの速度が低下し、$pee の一時コピーのためにメモリが消費されます。

于 2008-12-13T13:37:01.197 に答える
0

素晴らしいRegexBuddyを強くお勧めします

于 2008-12-08T16:34:49.510 に答える
-3

パターンからの一致を置き換えます

"|<p>|" 

文字列によって

"$1<p>"

| | 置換パターンの は、正規表現エンジンが左側の部分または右側の部分のいずれかに一致するようにします。

通常は「ta(b|p)e」のようなものであるため、なぜそのように使用されるのかわかりません...

$1 の場合、変数 $1 は PHP コードにあり、preg_replace 中に置き換えられたと思います。交換品は

"<p>" 

"test<p>"

しかし、1ドルでそれができるかどうかはわかりません

于 2008-12-08T16:16:04.493 に答える