0

そのため、正規表現は初めてで、アポストロフィ(')を。に置き換えることができる正規表現を作成しようとしています\'。私が思いついた正規表現は、http://myregextester.comでテストしたときにすべてのテストケースで機能しましたが、コードに実装すると完全にエラーになりました。

とにかく、これは私がまだ持っているものです:

preg_replace('/((?<!\\)\'+(?=\d\ds\b))|(\b(?<=\w)(?<!\\)\'+(?=\w+\b))/','\'',$text);

そしてそれはこのエラーをスローします:

PHPエラーが発生しました
重大度:警告
メッセージ:preg_replace()[function.preg-replace]:コンパイルに失敗しました:オフセット50で)がありません

私は20回のように数えて、どこが)一致していないかを確認しましたが、私の目には一致していません。これが私のいくつかのカウントの1つです:

( ( ?<!\\ )'+ ( ?=\d\ds\b ) ) | ( \b ( ?<=\w ) ( ?<!\\ ) '+ ( ?=\w+\b )  )
1 2       3   4           5 6   7    8       9 10      11   12        13 14

どんなアイデアでも、または初心者が見つけられない私の明白な間違いを指摘することは大いにありがたいです。

4

3 に答える 3

2

文字列内でエスケープする場合は、エスケープ文字もエスケープする必要があります。本当に紛らわしいです!

あなたがしたい場合は\あなたがする必要があります\\\\

于 2012-12-10T17:20:28.947 に答える
2

\\)文字列リテラルでは、正規表現パターン\)で-エスケープされた閉じ括弧-になります。これは、単一の引用符で区切られた文字列リテラル内でも、二重の円記号シーケンスが単一の円記号に補間されるためです。ただし、問題は、正規表現パターンのシーケンスがリテラルシンボルを表すために使用されることです(それ以外の場合はメタ文字として解析されます)。\))

あなたがやろうとしていることは、おそらく。で書くのが一番でしょう\\\\)。このようにして、文字列リテラルの各シーケンスはパターン内で\\単一になります。\パターンパーサーはこれを確認します。

\\)

...文字通りの円記号とそれに続く)メタ文字。

しかし、ここには別の問題があるようです。正規表現で、特別な(一連の)アポストロフィを探していますが、それらを再び単一のアポストロフィに置き換えます。文字列リテラル内には、それだけが含まれていることを忘れないでください\'-一重引用符!おそらく、'\\\''代わりにここで使用するつもりでした。

于 2012-12-10T17:22:25.320 に答える
0

ここで何かが足りませんか?なぜこれだけではないのですか?

str_replace("'", "\'", $str)
于 2012-12-10T17:20:28.947 に答える