0

私は自分のphpBB3のために何かに取り組んでいます、私はそれらの笑顔を元の笑顔の状態に戻そうとしています、例えば

:)  :(  :O  :P

スマイリーのHTMLにはこれが含まれているため、次のようになります。

/<img src=".*" alt="(.*)" title=".*">/gi

置き換え:

$1

ただし、複数のスマイリーがある場合は、最後のスマイリーが表示されます。たとえば、次のようになります。

代替テキストhttp://uimgz.com/i/R2e3H8g5D8.png

これに変わります:

:twisted:

これが右側の最後のスマイリーですが、なぜそれが置き換えられて、次のように返されるはずのすべてのスマイリー状態が返されなかったのですか?

:) :o :twisted:

正規表現は問題ないように見えますが、問題のようには見えません。すべての正規表現は、ループを使用して置換ループを通過するfor()ため、問題はありません。

複数のsmileysHTML:

<img src="./images/smilies/icon_e_smile.gif" alt=":)" title="Smile" /> <img src="./images/smilies/icon_e_surprised.gif" alt=":o" title="Surprised" /> <img src="./images/smilies/icon_twisted.gif" alt=":twisted:" title="Twisted Evil" />
4

2 に答える 2

1

正規表現をこれに変更して、再試行してください。

/<img src="[^"]*" alt="([^"]+)" title="[^"]*">/gi

正規表現エンジンは通常貪欲です。何かに一致する最長のテキストに一致しようとします。あなたの場合、私は3つのリンクすべてを1つに一致させました。ここで私がしたことは、src属性内のコンテンツを「」を含まないように制限することでした。これにより、3番目のsrcと完全に一致しなくなります。これはsrc属性として扱われます。./images/smilies/icon_e_smile.gif" alt=":)" title="Smile" /> <img src="./images/smilies/icon_e_surprised.gif" alt=":o" title="Surprised" /> <img src="./images/smilies/icon_twisted.gif

于 2011-01-09T19:58:27.007 に答える
1

欲張りでないマッチングに使用*?します。+?

/<img src=".*?" alt="(.+?)" title=".*?">/gi

失敗した例で起こっていることは、最初の例が.*これらすべてに一致しているということです。

./images/smilies/icon_e_smile.gif" alt=":)" title="Smile" /> <img src="./images/smilies/icon_e_surprised.gif" alt=":o" title="Surprised" /> <img src="./images/smilies/icon_twisted.gif

これはまだ有効な一致を生成していますが、それはあなたが望むものではありません。?after */は+、正規表現が一致を成功させるために必要な最小の文字列を消費するようにします。「貪欲に気をつけろ!」のセクションを読んでください。この記事では。

また、正規表現はHTMLを解析するための最良のツールではないという一般的な警告を追加したいと思います。たとえば、src属性がエスケープされている場合、私の正規表現でさえ壊れます。"

于 2011-01-09T20:01:20.407 に答える