2017-08-24 312 views
0

我遇到了PHP的問題。我需要讓它選擇#後面的所有字母和數字,但忽略「,」或「。」。 (逗號或句點)。目前它包括他們,我似乎無法讓他們排除他們。如何執行正則表達式排除逗號或句點

例如:#3431A或#4561AB(但忽略和,或在他們身後。)

preg_match_all(apply_filters("wpht_regex_pattern", '/#(\S+)/u'), strip_tags($content), $hashtags); 

回答

0

您匹配\S+爲1或以上的非空白字符的。在你的問題中,你說你想要一些數字和字母。要獲得字母和數字,您需要一個不同的模式。

function testFilter($test) { 
    $content = $test['test']; 
    echo "Testing {$content}\n"; 
    preg_match_all(apply_filters("wpht_regex_pattern", '/#([A-Za-z0-9]+)/u'), strip_tags($content), $hashtags); 

    $expect = $test['expect']; 
    echo " "; 
    if (! empty($expect)) { 
     $tmp = implode(',', $hashtags[1]); 
     if ($tmp != $expect) echo "FAIL "; 
     else echo "PASS "; 
    } 
    else { 
     echo "  "; 
    } 
    echo 'Hashtags: '. implode(',', $hashtags[1]); 
    echo PHP_EOL; 
}   

$contentTest = [ 
    ['test' => '#shoes, #friends, #beach',  'expect' => 'shoes,friends,beach'], 
    ['test' => '#shoes, #friends6, #2beach', 'expect' => 'shoes,friends6,2beach'], 
    ['test' => '#shoes, #frie_nds, #be^ach', 'expect' => 'shoes,frie,be'], 
    ['test' => 'blah blah #shoes, #friends, #beach', 'expect' => 'shoes,friends,beach'], 
    ['test' => '#shoes, #friends, #beach,',  'expect' => 'shoes,friends,beach'], 
    ['test' => '#shoes, #friends, #beach,#', 'expect' => 'shoes,friends,beach'], 
    ['test' => '#shoes, #friends, #beach som trailing text', 'expect' => 'shoes,friends,beach'], 
    ['test' => '#3431A, #345ADF', 'expect' => '3431A,345ADF'], 
    ['test' => 'The quick brown #fox gave the #99dogs codes #A00BZ90A #45678blah #0569509 #09XX09', 'expect' => 'fox,99dogs,A00BZ90A,45678blah,0569509,09XX09'], 
]; 
foreach ($contentTest as $t) { 
    testFilter($t); 
} 

輸出:

Testing #shoes, #friends, #beach 
    PASS Hashtags: shoes,friends,beach 
Testing #shoes, #friends6, #2beach 
    PASS Hashtags: shoes,friends6,2beach 
Testing #shoes, #frie_nds, #be^ach 
    PASS Hashtags: shoes,frie,be 
Testing blah blah #shoes, #friends, #beach 
    PASS Hashtags: shoes,friends,beach 
Testing #shoes, #friends, #beach, 
    PASS Hashtags: shoes,friends,beach 
Testing #shoes, #friends, #beach,# 
    PASS Hashtags: shoes,friends,beach 
Testing #shoes, #friends, #beach som trailing text 
    PASS Hashtags: shoes,friends,beach 
Testing #3431A, #345ADF 
    PASS Hashtags: 3431A,345ADF 
Testing The quick brown #fox gave the #99dogs codes #A00BZ90A #45678blah #0569509 #09XX09 
    PASS Hashtags: fox,99dogs,A00BZ90A,45678blah,0569509,09XX09 
+0

我已經試過了,但一旦數字結束,它忽略了阿爾法。 (例如:#3431A只返回#3431) – bworkman

+0

這並不是我在運行測試中看到的。看到我包括的輸出。 – ryantxr

0

你可以試試"/#[0-9A-Za-z]+/",如果你想選擇主題標籤具有唯一的字母和數字。 如果您想要抓取從#開始的標籤,並在遇到空格(或製表符),逗號或句點之前結束,您可以嘗試"/#[^\s,\.]+/"

下面是樣本PHP代碼和結果:

$content="I need to have it select all letters and numbers following the #, but ignore ',' or '.' (commas or periods). Ex: #3431A D, #3431AB or #4561AB."; 

echo "<h2>Regex-1:</h2>"; 
preg_match_all("/#[0-9A-Za-z]+/", $content, $hashtags); 
print_r($hashtags); 

echo "<h2>Regex-2:</h2>"; 
preg_match_all("/#[^\s,\.]+/", $content, $hashtags); 
print_r($hashtags); 

結果:

Regex-1: 

Array ([0] => Array ([0] => #3431A [1] => #3431AB [2] => #4561AB)) 

Regex-2: 

Array ([0] => Array ([0] => #3431A [1] => #3431AB [2] => #4561AB))