用PHP中的不可破坏空格替换特定空间

时间:2013-10-29 03:44:17

标签: php regex replace numbers

在使用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

3 个答案:

答案 0 :(得分: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)/

答案 1 :(得分:1)

你可以试试这个:

$result = preg_replace('~(?<=[0-9]) (?=[0-9])| (?=[!?:;…»)])|(?<=[«(]) ~i', '&nbsp;', $yourString);

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