2

正規表現の助けが必要です:

HTML 出力を取得したので、すべての登録商標を次のようにラップする必要があります。<sup></sup>

<sup>タイトルとプロパティにタグを挿入することはできませんalt。明らかに、既に上付き文字になっているレジストリをラップする必要はありません。

次の正規表現は、HTML タグの一部ではないテキストに一致します。

(?<=^|>)[^><]+?(?=<|$)

私が探しているものの例:

$original = `<div>asd&reg; asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>`

フィルタリングされた文字列は次のように出力されます。

<div>asd<sup>&reg;</sup> asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>

お時間をありがとうございました!!!

4

4 に答える 4

3

以下の制限に同意する場合の簡単な方法は次のとおりです。

既に処理された reg には、® の直後に </sup> があります。

echo preg_replace('#&reg;(?!\s*</sup>|[^<]*>)#','<sup>&reg;</sup>', $s);

背後にあるロジックは次のとおりです。

  1. ® のみを置き換えます。</sup> と ... が続かない
  2. < 記号を開かずに > 記号が続いていないもの
于 2009-09-02T16:41:10.760 に答える
3

HTMLは正規表現ではなく、あなたが夢見るよりも多くのエッジケースを提示するため、正規表現の代わりにHTMLパーサーを実際に使用します(上記で特定したコンテキスト上の制限を無視します)。

使用しているテクノロジーについては言及しません。それを投稿すると、誰かが間違いなく適切なパーサーを推奨できます。

于 2009-09-02T14:39:21.477 に答える
0

正規表現はあなたが望むものには十分ではありません。まず、コンテンツが属性の値であるか、要素のテキストノードであるかを識別するコードを記述する必要があります。次に、そのすべてのコンテンツを確認し、何らかの置換方法を使用する必要があります。PHPで何が表示されるかはわかりませんが、JavaScriptでは次のようになります。

content[i].replace(/\&reg;/g, "<sup>&reg;</sup>");
于 2009-09-02T15:31:56.143 に答える
0

正規表現は HTML を解析するのに適した方法ではないというブライアンの意見に同意しますが、正規表現を使用する必要がある場合は、文字列をトークンに分割し、各トークンで正規表現を実行してみてください。

preg_splitHTMLタグとフレーズで文字列を分割するために使用しています<sup>&reg</sup>-これにより、まだ上付き文字&reg;でもタグでもないテキストがトークンとして残ります。次に、トークンごとに、次の&reg;ように置き換えることができます<sup>&reg;</sup>

$regex = '/(<sup>&reg;<\/sup>|<.*?>)/i';
$original = '<div>asd&reg; asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>';

// we need to capture the tags so that the string can be rebuilt
$tokens = preg_split($regex, $original, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
/* $tokens => Array
(
    [0] => <div>
    [1] => asd&reg; asdasd. asd
    [2] => <sup>&reg;</sup>
    [3] => asd
    [4] => <img alt="qwe&reg;qwe" />
    [5] => </div>
)
*/

foreach ($tokens as &$token)
{
    if ($token[0] == "<") continue; // Skip tokens that are tags
    $token = substr_replace('&reg;', '<sup>&reg;</sup>');
}

$tokens = join("", $tokens); // reassemble the string
// $tokens => "<div>asd<sup>&reg;</sup> asdasd. asd<sup>&reg;</sup>asd <img alt="qwe&reg;qwe" /></div>"

これは単純なアプローチであり、出力が期待どおりにフォーマットされていない場合、希望どおりに解析されない可能性があることに注意してください (繰り返しますが、正規表現は HTML 解析には適していません ;) )

于 2009-09-02T16:06:30.283 に答える