2010-09-24 37 views
0

我需要按照/,:或whitespace的順序拆分(但不是preg_split())我的標題。例如,如果我拆分/,那麼我不想打擾尋找:或空格。我可以在這裏使用preg_replace()嗎?還是我需要使用preg_split()?

我以爲我可以用正則表達式做(輸入字符串,這裏將永遠具有HTML),則它

$delimiters = array('/', ':', '\s'); 

$title = preg_replace('@(' . implode('|', $delimiters) . ')(.*)[email protected]', '$1 <span>$2</span>', $title, 1); 

正則表達式我會匹配第一個空間,而不是與別人打擾。這不是我想要的。

很顯然,我可以strpos()爲其他字符(:/),從分隔符刪除\s若發現其他人。這將解決第一個問題。

我也想選擇最遠的右匹配,即如果在空格上分割一個句子,我想要匹配最後一個單詞。

我需要在這裏使用preg_split(),並保存分隔符,或者我可以用一個正則表達式嗎?

謝謝

+0

您能否提供一些示例輸入和輸出?我不認爲我完全明白你的問題。 – NullUserException 2010-09-24 02:55:07

+0

@NullUserException我加了我自己的答案(希望能夠回答上面的問題),但是如果你能找到更好的解決方案,可以隨意發佈。謝謝! – alex 2010-09-24 02:56:58

回答

1

那麼,這裏的另一個問題:

function alexify($title) { 
    $delimiters = array('/', ':', '\s'); 

    $regex = '@(' . implode('|', $delimiters) . ')([^' . implode($delimiters) . ']*)[email protected]'; 
    $title = preg_replace($regex, '$1<span>$2</span>', $title, 1); 

    return $title; 
} 

這似乎產生輸出你的函數相同:http://ideone.com/HVeh5

編輯:這實際上產生了第三根弦不同的輸出。我不知道哪一個應該是正確的。

+0

謝謝!所以你的正則表達式在不包含分隔符的分隔符的右側查找文本!輝煌! – alex 2010-09-24 04:28:41

+0

@alex有一件事尚未解釋:有些字符(正則表達式元字符)需要轉義才能使正則表達式正常工作。 – NullUserException 2010-09-24 04:31:27

+0

只要我只用'/',':'和'\ s',我應該是對的,對吧?我特別使用@符號作爲分隔符,所以我不需要轉義'/'。 :) – alex 2010-09-24 06:02:28

0

當我等待回答,我想出了這個,它的工作原理!

$delimiters = array('/', ':'); 

if (! preg_match('@(?:' . implode('|', $delimiters) . ')@', $title)) { 
    $delimiters[] = '\s'; 
} 

$tokens = preg_split('@(' . implode('|', $delimiters) . ')@', $title, NULL, PREG_SPLIT_DELIM_CAPTURE); 

$tokens[count($tokens) - 1] = '<span>' . end($tokens) . '</span>'; 

$title = implode($tokens); 
+0

查看此[此處](http://ideone.com/w4CWQ)。輸出是否適合你? – NullUserException 2010-09-24 03:03:54

+0

@NullUserException'亞歷克斯()'?哈哈!好吧,有點。我忘了提及這些字符串應該只有一個「:」或「\」。但也許我應該讓它更加防彈。謝謝! – alex 2010-09-24 03:07:42

+0

@NullUserException其實,這種行爲是確定的。 :)另外,看起來像我的'/'在我以前的評論中沒有出現。 (想想我不小心做了逃生) – alex 2010-09-24 03:14:42

相關問題