2016-11-18 18 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); 

爲了檢測時間戳SHORTCODE [SPP-時間戳時間= 「00:00」]

只需要添加更多的邏輯到這對選自DIV例如未選擇時間戳

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

例如,如果我把類「時間戳」在任何股利它不應該選擇與正則表達式。

可能嗎?

眼下它正在檢測郵票

00:00,00:00,晚上12點,0:00:00,而不是與上午或下午

+0

使用DOM解析和'// DIV [否(含有(@class, 「時間戳」))]'的xpath排除修改包含'div'元素的含量' timestamp'在他們的'class'屬性中。正則表達式將變得更容易。 –

+0

你能告訴我如何與上述正則表達式包括在內。因爲在PHP我可以preg_replace郵票成shortcode .... –

回答

1

選擇您需要解析與DOMDocumentXPath的HTML,這將允許您使用更簡單的正則表達式替換。 //div[not(contains(@class, "timestamp"))] xpath表達式將阻止修改其屬性中包含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寬度的不受支持的負向lookbehind,並在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

非常感謝你這個... :) –

相關問題