このビットの正規表現を php preg_match で使用して、「:」と「(」から末尾のスペースを取り除きます。
([\(:])\s+
私が直面している問題は、引用符で囲まれた必要なスペースを削除してしまうことです。たとえば、次の文字列です。
img[style*="float: left"]
二重引用符で囲まれていない限り、「:」または「(」と一致するように正規表現を記述する方法はありますか?
このビットの正規表現を php preg_match で使用して、「:」と「(」から末尾のスペースを取り除きます。
([\(:])\s+
私が直面している問題は、引用符で囲まれた必要なスペースを削除してしまうことです。たとえば、次の文字列です。
img[style*="float: left"]
二重引用符で囲まれていない限り、「:」または「(」と一致するように正規表現を記述する方法はありますか?
このルーチンは:
コード
<?php
$string = 'img[style*="float: left"]
img: [style*="float: left"]
img( [style*="float: left"]
';
$regex = '/"[^"]*"|([:(])\s+/ims';
$output = preg_replace_callback(
$regex,
function ($matches) {
if (array_key_exists (1, $matches)) {
return $matches[1] ;
}
return $matches[0];
},
$string
);
echo "this is the output:" . $output;
出力
this is the output:img[style*="float: left"]
img:[style*="float: left"]
img([style*="float: left"]
これには 2 つの方法があります。
否定的なルックアラウンド (情報はこちら) を使用して、削除したくないものの前後に二重引用符がないことを確認することができます。これに関して私が抱えている問題は、引用符からどれだけ離れているか、:
またはその(
可能性があるかどうかの兆候がなく、ルックアラウンドの長さが不明であってはならないことです。
私がやりたいのは\"[^"]+\"
、配列内の正規表現を使用して、二重引用符で囲まれたものをすべて「保存」し、それらを文字列に置き換えることです(「THIS_IS_A_QUOTE」を使用します)。すべての引用符を配列に保存したら、すべてのスペースを取り除き、最後にすべての「THIS_IS_A_QUOTE」文字列を配列内の文字列で復元します。
これを試すことができます:
$text = preg_replace('~(?|(\\\{2}|\\\"|"(?>[^"\\\]+|\\\{2}|\\\")*+")|([:(])\s+)~', '$1', $text);
アイデアは、前に二重引用符の部分を一致([:(])\s+
させ、それらを自分で置き換えることです。
エスケープされた引用符との一致を避けるために、バックスラッシュが前に一致します。
パターンの詳細:
~ # pattern delimiter
(?| # branch reset : all capture groups inside have the same number
( # open a capturing group
\\\{2} # group of 2 backslashes (can't escape everything)
| # OR
\\\" # an escaped double quote
| # OR
"(?>[^"\\\]+|\\\{2}|\\\")*+" # content inside double quotes
) # close the capturing group
| # OR
( [:(] ) # a : or a ( in a capturing group
\s+ # spaces
) # close the branch reset group
~ # pattern delimiter
興味深いのは、次のような状況に対処することです。
img: " : \" ( "
img: \" : ( " ( "
img: \\" : ( " ( "
結果:
img:" : \" ( "
img:\" :(" ( "
img:\\" : ( " ("