2010-09-24 113 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

相关问题