preg_split&内爆匹配

时间:2015-03-26 23:57:56

标签: php regex implode preg-split

我使用此代码将条目转换为小写,除了网址。

$fragments = preg_split( '/[ \n]/', $entry);
foreach ($fragments as &$fragment) {
    if(filter_var($fragment, FILTER_VALIDATE_URL) === FALSE)
    $fragment=mb_strtolower($fragment, "UTF-8");
    }
unset($fragment);
$entry = implode(' ', $fragments);

问题是片段被空格或换行符分割,如上所示。但它们都只被空间破坏了。

根据分裂方法将其破坏的任何解决方案?

1 个答案:

答案 0 :(得分:0)

  1. 我同意 @zerkms 的观点,使用 preg_replace_callback() 对每个符合条件的子字符串执行自定义函数。
  2. 通过反转原始模式的逻辑以匹配非空白子字符串,您可以避免将拆分字符串与适当的空白字符粘合在一起的挑战。
  3. 我正在展示如何使用更新后的字符串覆盖 $entry,但您当然可以根据需要立即echo 返回值。

代码:(Demo)

$entry = <<<ENTRY
Bob 1 https://www.example.com#Anchor
Joe 2 joe@exAmple.com
Sam 3 http://examPle.org
Ian 4 www.Example.net
Öna 5 eXample.info
Eve 6 Heart_in_a_Blender
ENTRY;

$entry = preg_replace_callback(
             '/\S+/',
             function($m) {
                 if (!filter_var($m[0], FILTER_VALIDATE_URL)) {
                     $m[0] = mb_strtolower($m[0], "UTF-8");
                 }
                 return $m[0];
             },
             $entry
         );
echo $entry;

输出:

bob 1 https://www.example.com#Anchor
joe 2 joe@example.com
sam 3 http://examPle.org
ian 4 www.example.net
öna 5 example.info
eve 6 heart_in_a_blender