0

こんにちはみんな私は正規表現に非常に慣れていません、これで私を助けてくれませんか。

私はこのような文字列を持っていますが、何"<input attribute='value' >"でもattribute='value'かまいません。preg_replace<input />

ワイルドカードを指定して、srting内の任意の数の文字を置き換えるにはどうすればよいですか?

このような?preg_replace("/<input.*>/",$replacement,$string);

どうもありがとう

4

4 に答える 4

10

あなたが持っているもの:

.*

「任意の文字、および可能な限り多くの文字に一致します。

あなたが意味するのは

[^>]+

これは「任意の文字、それは">ではない」と解釈され、少なくとも1つは存在する必要があります

または代わりに、

.*?

これは、「任意の文字ですが、このルールを機能させるのに十分なだけです」という意味です。

しかし、しないでください

正規表現を使用したHTMLの解析は不適切です

既存のhtmlパーサー、DOMライブラリ、その他のいずれかを使用します。ナイーブな正規表現ではありません。

例えば:

 <foo attr=">"> 

正規表現によって誤って取得されます

'<foo attr=" ' with following text of '">' 

これは、この正規表現につながります。

 `<[a-zA-Z]+( [a-zA-Z]+=['"][^"']['"])*)>  etc etc 

その時点で、この素敵な宝石を発見するでしょう:

 <foo attr="'>\'\"">

そしてあなたの頭は爆発します。

(構文ハイライトは私のポイントを確認し、タグを終了したと思って誤って一致します。)

于 2008-11-12T21:40:50.827 に答える
1

何人かは親しかった...でも100%ではない:

これ:

preg_replace("<input[^>]*>", $replacement, $string);

これである必要があります:

preg_replace("<input[^>]*?>", $replacement, $string);

あなたはそれが貪欲な試合になりたくない.

于 2008-11-12T22:32:21.940 に答える
0

私が質問を正しく理解している場合、あなたはコードを持っています:

preg_replace("/<input.*>/",$replacement,$string);

。*と一致したものを削除するために$replacementに何を使用する必要があるかを教えてください。

あなたはこれについて逆に行かなければなりません。キャプチャグループを使用して、保持したいものをキャプチャし、それを置換に再挿入します。例えば:

preg_replace("/(<input).*(>)/","$1$2",$string);

もちろん、リテラルテキストを再挿入するだけなので、ここでグループをキャプチャする必要はありません。上記の賭けは、タグが変化する可能性がある状況でこれを実行したい場合のテクニックを示しています。これはより良い解決策です:

preg_replace("/<input [^>]*>/","<input />",$string);

否定された文字クラスは、ドットよりも具体的です。この正規表現は、文字列に2つのHTMLタグがある場合に機能します。元の正規表現はそうではありません。

于 2008-11-13T16:55:21.803 に答える
0
preg_replace("<input[^>]*>", $replacement, $string); 
// [^>] means "any character except the greater than symbol / right tag bracket"

これは本当に基本的なことです。いくつかの読書に追いつく必要があります。:-)

于 2008-11-12T21:41:39.220 に答える