2016-11-18 3 views
2

私はこのコードを使用してコンテンツからタイムスタンプを検出しています。タイムスタンプを正規表現でショートコードに変換

$pattern = '/(?<!:)\d{1,2}:\d{2}(?::\d{2})?(?!(?::\d{2})?\s*[ap]\.?m\.?)(?!.*?["\'])/'; 
$replacement = '[spp-timestamp time="$0"]'; 
$foundTimestamp = preg_replace ($pattern,$replacement, $content); 

がショートしたタイムスタンプを検出するために、[SPP-タイムスタンプの時間を=「夜12時」]

ただ、例えば選択DIVからタイムスタンプを選択しないように、このにより多くのロジックを追加したい

<div class="sm2-inline-duration timestamp">0:00</div> and 
<div class="sm2-inline-time timestamp">0:00</div> 

たとえば、私がクラス "timestamp"をdivに入れると正規表現で選択してはいけません。

可能ですか?

今のあなたが解析する必要がスタンプ

午後12時00分、00:00:00午前0時00、午後十二時00分00秒、およびAMまたはPM

+0

使用DOMの解析と 'が含まれている' div'要素の内容を変更する除外する '// DIV [ない((@class、 "タイムスタンプ" が含まれて))]' XPathを参照してください。 'class'属性に' timestamp'を追加しました。正規表現ははるかに簡単になります。 –

+0

上記の正規表現がどのように含まれているかを表示できますか? PHPで私はショートコードにpreg_replaceを置き換えることができるので.... –

答えて

1

を選択していないを検出していますHTMLをDOMDocumentXPathにすると、より簡単な正規表現を使用して置き換えることができます。 //div[not(contains(@class, "timestamp"))] xpath式は、class属性にtimestamp部分文字列を含む要素divの内容を変更できないようにします。

$html = <<<DATA 
<body> 
<div class="sm2-inline-duration timestamp">0:00</div> 
<div class="sm2-inline-time timestamp">0:00</div> 
<div class="sm2-inline-duration">0:00</div> 
<div class="sm2-inline-duration">Do not touch this</div> 
</body> 
DATA; 

$dom = new DOMDocument('1.0', 'UTF-8'); 
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$pattern = '/(?<!:)\d{1,2}:\d{2}(?::\d{2})?(?!(?::\d{2})?\s*[ap]\.?m\.?)/i'; 
$replacement = '[spp-timestamp time="$0"]'; 

$xpath = new DOMXPath($dom); 
$divs = $xpath->query('//div[not(contains(@class, "timestamp"))]'); 

foreach($divs as $div) { 
    $div->nodeValue = preg_replace ($pattern,$replacement, $div->nodeValue); 
} 

echo $dom->saveHTML(); 

は、教育目的のためにPHP demo

を参照してください、ここでとして、これは、任意のHTMLと安全生産に動作しません。正規表現ベースのアプローチです。

考えられるのは、inifinite幅のサポートされていないネガティブなビヘイビアをオプションのキャプチャグループに置き換えて、グループが一致する場合はpreg_replace_callbackをチェックし、適切な置換を使用することです(一致する場合は元のマッチテキストを保持する必要があります。 、私たちのカスタム交換で置き換えてください)。

$pattern = '/(<div\s+[^<]*?\bclass="[^<"]*\btimestamp\b[^<]*?>[^<]*)?(?<!:)\d{1,2}:\d{2}(?::\d{2})?(?!(?::\d{2})?\s*[ap]\.?m\.?)(?!.*?["\'])/'; 
$replacement = '[spp-timestamp time="$0"]'; 
$foundTimestamp = preg_replace_callback($pattern,function($m) { 
    return empty($m[1]) ? '[spp-timestamp time="'. $m[0] . '"]' : $m[0]; 
}, $content); 
echo $foundTimestamp; 

another PHP demo

+1

これは本当にありがとう... :) –

関連する問題