2016-11-18 1 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-타임 스탬프 시간을 = "0시"]

그냥 예를 들어 선택 사업부에서 타임 스탬프를 선택하지이에 더 많은 로직을 추가 할

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

예를 들어 어떤 div에 "timestamp"클래스를 넣으면 정규식으로 선택하면 안됩니다.

가능합니까?

지금의이 감지하는 스탬프

0시

00:00:00 0:00 0:00:00하고, 오전 또는 오후

+0

를 사용하여 DOM 구문 분석 및'// DIV [((@class "타임 스탬프") 포함)하지]'XPath는 제외가 포함 된'div' 요소의 내용을 수정' timestamp'를'class' 속성에 추가합니다. 정규식은 훨씬 쉽게 될 것입니다. –

+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 안전하게 생산에서 작동하지 않습니다 로 정규식 기반의 접근 방식이다.

아이디 네이트 너비의 지원되지 않는 음수 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

정말 고마워요 ... :) –