Php 如何逐字浏览字符串文本并替换它

Php 如何逐字浏览字符串文本并替换它,php,html,regex,Php,Html,Regex,我有一个像这样的php数组 $values = array( "hello" => "12", "a" => "24", "grand" => "40", "mother" => "10" ); 还有一个字符串 $string=“你好我是祖母” 初始文本可以包含html代码。这一点很重要 我需要用替换字符串中的所有单词 word 在我的示例中,结果将是: 你好 我是 A. 宏伟的 母亲 主要问题是它可以用于基本字符串替换,因为它将替换单词“grand”中的单词

我有一个像这样的php数组

$values = array(
"hello" => "12",
"a" => "24",
"grand" => "40",
"mother" => "10"
);
还有一个字符串
$string=“你好

我是祖母”
初始文本可以包含html代码。这一点很重要

我需要用替换字符串中的所有单词
word

在我的示例中,结果将是:


你好

我是 A. 宏伟的 母亲
主要问题是它可以用于基本字符串替换,因为它将替换单词“grand”中的单词“a”。 另外,我需要在文本中保留初始html代码。 我不知道是否可以浏览我的字符串文本,如果存在单词,是否可以逐字替换。

这是我的解决方案:

<?php
$string = "hello i am a grand mother"; 

$values = array(
    "hello" => "12",
    "a" => "24",
    "grand" => "40",
    "mother" => "10"
);

foreach($values as $word=>$id){
    $string = preg_replace("/(\s|^)$word(\s|$)/","$1<span id=\"$id\">$word</span>$2",$string);  
}

echo $string;

这里不需要正则表达式。PHP有一个标记字符串的函数(将字符串拆分为较小的字符串)

这种方法还利用
array\u keys()
返回
$values
数组中的键数组

<?php

$values = array(
    "hello" => "12",
    "a" => "24",
    "grand" => "40",
    "mother" => "10"
    );

$string = "hello I am a grand mother";
$token = strtok($string, " ");
$newString = '';

while ($token !== false) {
    if (in_array($token, array_keys($values))) {
        $newString .= "<span id='" . $values[$token] . "'>". $token . "</span> ";
    } else {
        $newString .= " " . $token . " ";
    }
    $token = strtok(" ");
}

echo $newString;
?>

虽然提出了一个解决方案,但有点晚。这里是:

$exp = explode(' ', $string);

foreach ($exp as $e) {
    if (array_key_exists($e, $values))
    {
        $a = "<span id=\"".$values[$e]."\">".$e."</span>";

    }
    else
    {
        $a = $e.' ';    
    }       
    $result .= $a;
}

echo $result;
$exp=explode(“”,$string);
foreach($exp作为$e){
如果(数组\键\存在($e$values))
{
$a=“”.$e.”;
}
其他的
{
$a=$e.';
}       
$result.=$a;
}
回声$结果;
尝试使用此代码,计算字符串单词数,并使用条件创建for循环

$values = array(
    "hello" => "12",
    "a" => "24",
    "grand" => "40",
    "mother" => "10"
);

$string = "

hello

i am a grand mother";
$string = preg_replace('/\s+/', ' ', $string);
$stringExp = explode(" ", $string); 

$len = count($stringExp);
$newString = '<p>';
for($i=0; $i<$len;$i++){
    if (in_array($stringExp[$i], array_keys($values))) {
        $newString .= "<span id='" . $values[$stringExp[$i]] . "'>". $stringExp[$i] . "</span> ";
    } else {
        $newString .= " " . $stringExp[$i] . " ";
    }   
    if ($i == 1) {
        $newString .= '</p><div style="align:center">';
    } else if ($i == $len - 1) {
         $newString .= "</div>";
    }   
}
echo $newString;
$values=数组(
“你好”=>“12”,
“a”=>“24”,
“大”=>“40”,
“母亲”=>“10”
);
$string=”
你好
“我是祖母”;
$string=preg_replace('/\s+/','$string);
$stringExp=分解(“,$string);
$len=计数($stringExp);
$newString='';

对于($i=0;$iI,我想这就是你需要的。$string=“你好,我是一位祖母”;$string=preg\u replace('/\s+/','','',$string);HTML代码现在打断了字符串赋值。你需要查看混合单曲“``和
"
这难道不会遗漏数组中不存在的附加词吗?对于OP示例
I
am
?谢谢你的回答!!!抱歉,我编辑了我的帖子。我的初始文本包含html代码。我需要保留它。你的代码适用于此?谢谢!@philou75015如果你的编辑建议字符串被拆分为多个lines,您可以将换行符添加到标记输入中。@philou75015标记化方法依赖于您的单词被空格分隔。我看不到您添加的HTML标记。请编辑问题,使用单个“backticks”将字符串括起来,并将其格式化为
code
,我稍后会查看此方法是否正确h可以容纳添加的HTMLTX Samuel,它可以很好地工作,但不能在2种情况下工作。1°当我的单词在字符串文本中有大写字母时(数组中没有),2°当单词在特殊字符后面时(例如$string=“你好,我是祖母和你的祖父;它可以是逗号,但也可以是”和其他特殊字符..)提前谢谢谢谢谢谢谢谢!!!
//<p><span id="12">hello</span></p><div style="align:center">i am <span id="24">a</span><span id="40">grand</span><span id="10">mother</span></div>