我需要按顺序在preg_split()
,/
或空格上拆分(但不是:
)我的标题。例如,如果我在/
上拆分,那么我不想费心寻找:
或空格。
我认为我可以使用正则表达式(此处的输入字符串从不中包含HTML)
$delimiters = array('/', ':', '\s');
$title = preg_replace('@(' . implode('|', $delimiters) . ')(.*)$@', '$1 <span>$2</span>', $title, 1);
我所拥有的正则表达式将匹配第一个空格,而不会打扰其他空格。这不是我想要的。
显然我可以strpos()
查看其他字符(:
和/
),如果找到其他字符,则从分隔符中删除\s
。这将解决第一个问题。
我还想选择最右边的匹配,即如果在空格上分割句子,我希望最后一个单词匹配。
我是否需要在此处使用preg_split()
,并保留分隔符,还是可以使用一个正则表达式进行分配?
由于
答案 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);