2009-04-17 12 views

答えて

0

これは機能しますか?

\"(?!\s*\w*>) 
+1

最も確かではありません。あなたは実際の事例を試しましたか? – Tomalak

6

このような正規表現はありません。

<p> 
    <!-- <a href=" --> is this outside " a tag <!-- "> foo </a> --> or not? 
</p> 

残念ながら、HTMLパーサーを使用する必要があります。すでにHTMLを検証しているので、おそらく既にパーサーを使用しているはずです。

+0

今、今、私はそれのための表現が存在すると確信しています。 P – brianreavis

+1

@brianreavis:私はあなたが冗談だと​​気づいていますが、実際には:http:// en.wikipedia.org/wiki/Regular_language ...実際には不可能で、数学的に証明できる。 – derobert

1

正規表現を使用しないでください。パーサーを使用(または書き込む)してください。

次のコードは、入力HTML文字列が(あなたが述べたように)整形式であることを前提としています。無効な入力に遭遇すると、コードが壊れることに注意してください!

整形式がわからない場合は、PHP Tidyを試してみてください。

<?php 
$html = '<tag>text "text"<tag attr="value"><!-- "text" --> text</tag> "text".'; 
echo html_escape_quotes($html); 

/* Parses input HTML and escapes any literal double quotes 
    in the text content with &quot;. Leaves comments alone. */ 
function html_escape_quotes($html) 
{ 
    $output = ""; 
    $length = strlen($html); 
    $delim = "<"; 
    $offset = 0; 
    while ($offset < $length) { 
    $tokpos = strpos($html, $delim, $offset); 
    if ($tokpos === false) $tokpos = $length; 

    $token = substr($html, $offset, $tokpos - $offset); 
    $offset = $tokpos; 

    if ($delim == "<") { 
     $token = str_replace('"', '&quot;', $token); 
     $delim = substr($html, $offset, 4) == "<!--" ? "-->" : ">"; 
    } else { 
     $delim = "<"; 
    } 

    $output .= $token; 
    } 
    return $output; 
} 
?> 
+2

属性に '>'が含まれている場合、これは機能しません。これは一般的ではありませんが、有効であり、したがって可能です。 – Gumbo

+0

うーん...私はそれが関係なくエスケープされることを期待するだろう。しかし、あなたは正しいです、理論的には可能です。 +1のコメント。 – Tomalak

+0

正規表現でちょっと遊んでいたので、次の式はタグの有効な終わりを見つけます(常に有効なHTMLと仮定しています):/ [^ "<>] +((?:" [^ "] *" | '[[ – Tomalak

0

可能です。

正規表現を使って、以下のようなことができるかもしれません。あなたはより良いアプローチは、機能の交換を行うためにコールバックを利用することであろう、

Serach: (\<.+?\>.+?)(")(.+?\</.+?\>) 
Replace: $1'$3 

。この正規表現は、タグの間」で「唯一の1を置き換えとして、カントー、それを複数回実行する必要がありますが。ただ、コンテンツを送信REを作成しますのタグを関​​数に渡すことができます。

詳細情報hereを参照してください。コールバックを検索します。 derobertが指摘したように、あなたがその前にコメントを削除する必要があるかもしれません:)

+0

コメントを削除しても(どのようにパーサを使っていると思いますが)、あなたはすべての種類のものを残しています。例えば、引用符で囲まれた文字列を使って楽しい文字を入力することができます。< and >は引用符で囲んだ文字列の中で有効で、さらには

0

あなたは文字列を分割し、この式とテキストデータからタグを分離するために試みることができる:

<(?:\?[^?]+\?>|[A-Za-z]+(?:[^">]+|"[^"]*")*|!(?:\[CDATA\[(?:[^\]]+|](?:[^\]]|][^>]))*]]|--(?:[^-]+|-(?!->))*--))> 

これは、(うまくいけば)なります任意のXML PI、要素タグ、CDATAおよびコメントブロックに一致します。

ので:

$parts = preg_split('/(<(?:\?[^?]+\?>|[A-Za-z]+(?:[^">]+|"[^"]*")*|!(?:\[CDATA\[(?:[^\]]+|](?:[^\]]|][^>]))*]]|--(?:[^-]+|-(?!->))*--))>)/', $str, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 
$str = ''; 
foreach ($parts as $part) { 
    if ($part[0] == '<') { 
     $str .= $part; 
    } else { 
     $str .= str_replace('"', '&quot;', $part); 
    } 
} 

しかし、私は、これは非常に効率的であることを疑います。実際のパーサーは、より効率的で正しいでしょう。

0

ない私にとっては最高の(すべてではない状況で動作します)が、十分:

function quoting(&$data) { 
    $quot = '(["\x93\x94\x84]|\&#8220;|\&#8222;|\&#8221;|\&ldquo;|\&bdquo;|\&rdquo;|\&quo;|\&#34;)'; 
    $parse = '<q>$2</q>'; 
    $data = preg_replace('/="([^"]*)"/', '*%Q:$1%*', $data); 
    $data = preg_replace("/$quot(.*?)$quot/", $parse, $data); 
    $data = preg_replace('/\*%Q:(.*?)%\*/', '="$1"', $data); 
} 
関連する問題