2

このシナリオでpreg_replaceが何も返さないのはなぜですか?私は一晩中それを理解しようとしてきました。

$postContentに含まれるテキストは次のとおりです。

これをテストします。見積もりは次のとおりです。[見積もり]1[/見積もり]見積もりは終了しました。

これが私のコードです:

echo "Test I'm Here!!!";
                    $startQuotePos = strpos($postContent,'[Quote]')+7;
                    $endQuotePos = strpos($postContent,'[/Quote]');
                    $postStrLength = strlen($postContent);
                    $quotePostID = substr($postContent,$startQuotePos,($endQuotePos-$postStrLength));
                    $quotePattern = '[Quote]'.$quotePostID.'[/Quote]';
                    $newPCAQ = preg_replace($quotePattern,$quotePostID,$postContent);
                    echo "<br />$startQuotePos<br />$endQuotePos<br />$quotePostID<br />Qpattern:$quotePattern<br />PCAQ: $newPCAQ<br />";

これが私の結果です:

テスト私はここにいます!!!

35

36

1

Qpattern:[Quote] 1 [/ Quote]

PCAQ:

4

3 に答える 3

3

の場合、次のいずれかである単一の文字preg_replace()に一致します: quot、またはe"[Quote]"

preg_replace()リテラルを検索したい場合は"[Quote]"、としてエスケープする必要があります"\[Quote\]"preg_quote()は、使用する必要のある関数ですpreg_quote("[Quote]")

正規表現は区切り文字で始まると予想されるため、コードも間違っています。回答の最後に表示しているpreg_replace()呼び出し、つまり@ですが、正規表現に表示されない限り、別の文字を使用できます。また、正規表現の最後でも使用されます。(私の場合、@の後にパターン修飾子が続き、パターン区切り文字の後に許可される文字はパターン修飾子だけです。)

を使用する場合preg_replace()、最初にどこにあるかを見つけるのは意味がありません"[Quote]"。私はむしろ次のコードを使用したいと思います:

$newPCAQ = preg_replace('@\[Quote\](.+?)\[/Quote\]@i', '\1', $postContent);

私が使用している正規表現について説明します。

  • 最後は、小文字と大文字の違いを無視するように'@i'言っています。preg_replace()文字列には、を含めることができ"[QuOte]234[/QuOTE]"、その部分文字列は同じ正規表現と一致します。

  • あまりにも貪欲で、あまりにも多くの文字に一致"(.+?)"することを避けるために、疑問符を使用します。".+"これがないと、正規表現は1つの一致に次のような部分文字列を含めることができますが、"[Quote]234[/Quote] Other text [Quote]475[/Quote]"これは2つの部分文字列として一致する必要があります:"[Quote]234[/Quote]"、および"[Quote]475[/Quote]"

  • '\1'私が置換文字列としてpreg_replace()使用している文字列は、サブグループから一致した文字列を置換として使用することを示しています"(.+?)"。言い換えると、への呼び出しpreg_replace()は、を削除し"[Quote]""[/Quote]"他のテキストを囲んでいます。(のように、"[/Quote]"と一致しないものは置き換えられません。)"[Quote]""[/Quote] Other text [Quote]"

于 2012-12-09T07:07:19.550 に答える
2

正規表現は「/」で開始および終了する必要があります:

$quotePattern = '/[Quote]'.$quotePostID.'[/Quote]/';
于 2012-12-09T06:51:28.683 に答える
1

preg_replaceの戻り値が何も表示されないのは、preg_replaceが戻​​ってきたためですNULL詳細については、手動リンクを参照してください)。これは、エラーが発生したときにpreg_replaceが返すものであり、状況で発生したものです。の文字列値は長さNULLゼロの文字列です。代わりにvar_dumpを使用すると、これを確認できます。これにより、preg_replaceがNULLを返したことがわかります。

正規表現が無効であるため、PHPは次のE_WARNINGレベルエラーをスローします。Warning: preg_replace(): Unknown modifier '['

これにはいくつかの理由があります。まず、preg_ *関数はPCREスタイルの正規表現を使用するため、正規表現の開始と終了の区切り文字を指定する必要があります。次に、パターンにpreg_quoteを使用して(区切り文字を除く)、適切にエスケープされるようにすることも検討します。

$postContent = "Test this. Here is a quote: [Quote]1[/Quote] Quote is now over.";
/* Specify a delimiter for your regular expression */
$delimiter = '@';

$startQuotePos = strpos($postContent,'[Quote]')+7;
$endQuotePos = strpos($postContent,'[/Quote]');
$postStrLength = strlen($postContent);
$quotePostID = substr($postContent,$startQuotePos,($endQuotePos-$postStrLength));
/* Make sure you use the delimiter in your pattern and escape it properly */
$quotePattern = $delimiter . preg_quote("[Quote]{$quotePostID}[/Quote]", $delimiter) . $delimiter;
$newPCAQ = preg_replace($quotePattern,$quotePostID,$postContent);
echo "<br />$startQuotePos<br />$endQuotePos<br />$quotePostID<br />Qpattern:$quotePattern<br />PCAQ: $newPCAQ<br />";

出力は次のようになります。

35

36

1

Qpattern:@ [Quote] 1 [/ Quote] @

PCAQ:これをテストします。見積もりは次のとおりです。1見積もりは終了しました。

于 2012-12-09T07:10:51.500 に答える