2

在使用 php 进行编码以及我第一次发布到 stackoverflow 时,我是一个完整的初学者。我的代码有一些问题。我正在尝试在字符串中搜索一个数字,然后是一个空格,然后是另一个数字,然后用不可破坏的空格替换空格。我知道我需要使用正则表达式,但我仍然无法弄清楚。任何帮助将不胜感激。我的代码是:

echo replaceSpace("hello world ! 1 234");
function replaceSpace( $text ){        
   $brokenspace = array(" !", " ?", " ;", " :", " …", "« ", " »", "( ", " )");
   $fixedspace = array(" !", " ?", " ;", " :", " »", " …", "« ", "( ", " )");

   return str_replace( $brokenspace , $fixedspace, $text );            
}

我希望我的输出是:

你好世界(nbsp)!1(nbsp)234

4

3 回答 3

3

这里:

<?php
$str = 'Some string has 30 characters and 1 line.';
$withNbsp = preg_replace('/([0-9]+)\s(\w)/', '$1&nbsp;$2', $str);
echo $withNbsp; // Some string has 30&nbsp;characters and 1&nbsp;line.
?>

关键是正则表达式:/([0-9]+)\s(\w)/

于 2013-10-29T03:50:20.887 回答
1

你可以试试这个:

$result = preg_replace('~(?<=[0-9]) (?=[0-9])| (?=[!?:;…»)])|(?<=[«(]) ~i', '&nbsp;', $yourString);
于 2013-10-29T04:10:39.280 回答
1

关于如何执行此操作,您有几个选择。

您可以继续使用该str_replace()方法并组合preg_replace()调用以在数字后跟空格和另一个数字之间插入不间断空格。

echo _replace('hello world ! 1 234');

function _replace($text) { 
    $map = array(' !' => '&nbsp;!', ' ?' => '&nbsp;?', 
                 ' ;' => '&nbsp;;', ' :' => '&nbsp;:', 
                 ' …' => '&nbsp;…', ' »' => '&nbsp;»',
                 ' )' => '&nbsp;)', '( ' => '(&nbsp;', 
                 '« ' => '«&nbsp;'
                );
    $text = str_replace(array_keys($map), array_values($map), $text);
    return preg_replace('/(?<![^0-9]) (?=[0-9])/', '&nbsp;', $text);
}

您可以使用更便宜strtr的来翻译字符并替换您的子字符串。除了这样做之外,您还可以preg_replace()在函数内部使用关联数组来提高可读性。

echo _replace('hello world ! 1 234');

function _replace($text) { 
   $text = strtr($text, 
         array(' !' => '&nbsp;!', ' ?' => '&nbsp;?',
               ' ;' => '&nbsp;;', ' :' => '&nbsp;:', 
               ' …' => '&nbsp;…', ' »' => '&nbsp;»',
               ' )' => '&nbsp;)', '( ' => '(&nbsp;', 
               '« ' => '«&nbsp;'));

   return preg_replace('/(?<![^0-9]) (?=[0-9])/', '&nbsp;', $text);
}

您可以使用单个preg_replace()调用和组合正则表达式替换上述所有内容。

$s = preg_replace('/ (?=[!?;:…»)])|(?<![^0-9]) (?=[0-9])|(?<![^«(]) /', '&nbsp;', $s);
于 2013-10-29T04:32:23.110 回答