我可以在这里使用preg_replace(),还是需要使用preg_split()?

时间:2010-09-24 02:35:36

标签: php regex

我需要按顺序在preg_split()/或空格上拆分(但不是:)我的标题。例如,如果我在/上拆分,那么我不想费心寻找:或空格。

我认为我可以使用正则表达式(此处的输入字符串从不中包含HTML)

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

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

我所拥有的正则表达式将匹配第一个空格,而不会打扰其他空格。这不是我想要的。

显然我可以strpos()查看其他字符(:/),如果找到其他字符,则从分隔符中删除\s。这将解决第一个问题。

我还想选择最右边的匹配,即如果在空格上分割句子,我希望最后一个单词匹配。

我是否需要在此处使用preg_split(),并保留分隔符,还是可以使用一个正则表达式进行分配?

由于

2 个答案:

答案 0 :(得分:1)

嗯,这是另一个:

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

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

    return $title;
}

它似乎产生与您的函数相同的输出:http://ideone.com/HVeh5

编辑:它实际上为第3个字符串产生不同的输出。我不知道哪一个应该是正确的。

答案 1 :(得分: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);