只有在PHP中被空格包围时才替换文本

时间:2018-06-24 00:01:15

标签: php forms replace find translation

我正在尝试创建一种表单,用户可以提交该表单并使用它查找和替换长字符串中的文本。但是,我要替换的许多字符串只有2-3个字母(例如,“ od”,“ ph”),通常会在单词中间找到它们。我想遍历我要搜索的所有短语,并且仅在字符串前有空格的情况下才替换它们,以避免替换单词中间的字符串。有什么想法吗?

if(isset($_POST["text"]))
{
    $original = $_POST["text"];
    $abbreviation= array();
    $abbreviation[0] = 'od';
    $abbreviation[1] = 'rn';        
    $abbreviation[2] = 'ph';
    $abbreviation[3] = 'real';  
    $translated= array();
    $translated[0] ='odometer';
    $translated[1] ='run';
    $translated[2] ='pinhole';
    $translated[3] ='fake';
    $newtext=  str_ireplace ($abbreviation, $translated ,$original);
    echo nl2br(htmlspecialchars($newnote));
}

1 个答案:

答案 0 :(得分:1)

您可以使用两侧的单词边界声明(\b)将缩写视为一个单独的单词:

preg_replace('/\bod\b/i', 'odometer', 'od test od test od.')
// "odometer test odometer test odometer."

如果您只想在字符串周围有空格时才进行匹配,请使用匹配空格((?<=)的先行断言((?=)和先行断言(\s):< / p>

preg_replace('/(^|(?<=\s))od((?=\s)|$)/i', 'odometer', 'od test od test od.')
// "odometer test odometer test od."

请注意尾随时间段的区别方式。 (还请注意,preg_replace可以将多个模式/替换映射作为数组。)

来自docs

  

单词边界是主题字符串中当前位置的位置   字符和前一个字符都不匹配\ w或\ W(即   一个匹配\ w,另一个匹配\ W),或者匹配的开始或结尾   如果第一个或最后一个字符分别与\ w匹配,则为字符串。

\w\W表示“单词”和“非单词”字符:

  

“单词”字符是任何字母或数字或下划线字符,   也就是说,任何可以成为Perl“单词”组成部分的字符。的   字母和数字的定义由PCRE的字符控制   表,并且如果进行特定于语言环境的匹配可能会有所不同。对于   例如,在“ fr”(法语)语言环境中,某些字符代码更大   重音字母使用的字符数超过128,并且与\ w匹配。