Php 替换所有出现的字符串

Php 替换所有出现的字符串,php,preg-replace,Php,Preg Replace,我想在所有p标记中添加一个类,其中包含阿拉伯语文本。例如: <p>لمبارة وذ</p> <p>do nothing</p> <p>خمس دقائق يخ</p> <p>مراعاة إبقاء 3 لاعبين</p> 然而,它不能正常工作。它有两个问题: 它只匹配第一段 添加一个空的 沙箱 它只匹配第一段 这是因为您添加了最后一个参数,表示只希望替换第一个出现的参数。别提那个论点 添

我想在所有
p
标记中添加一个类,其中包含阿拉伯语文本。例如:

<p>لمبارة وذ</p> 
<p>do nothing</p> 
<p>خمس دقائق يخ</p> 
<p>مراعاة إبقاء 3 لاعبين</p>
然而,它不能正常工作。它有两个问题:

  • 它只匹配第一段
  • 添加一个空的
  • 沙箱

    它只匹配第一段

    这是因为您添加了最后一个参数,表示只希望替换第一个出现的参数。别提那个论点

    添加一个空的

    这实际上是您不匹配的原始
    。只需将其添加到匹配模式中,但将其保留在匹配组之外,这样当您替换为
    $1
    时,它将被忽略

    以下是一个更正版本,也是关于:

    $text=preg\u replace(“~(\p{阿拉伯语}+)~u”,“

    $1”,“$string”);

    它只匹配第一段

    这是因为您添加了最后一个参数,表示只希望替换第一个出现的参数。别提那个论点

    添加一个空的

    这实际上是您不匹配的原始
    。只需将其添加到匹配模式中,但将其保留在匹配组之外,这样当您替换为
    $1
    时,它将被忽略

    以下是一个更正版本,也是关于:

    $text=preg\u replace(“~(\p{阿拉伯语}+)~u”,“

    $1”,“$string”);


    您的第一个问题是您没有告诉它匹配
    ,所以它没有

    你的主要问题是空格不是阿拉伯语。只需添加与之匹配的备选方案即可解决您的问题:

    $text = preg_replace("~<p>(\p{Arabic}*|\s*)~u", "<p class=\"foo\">$1", $string);
    
    $text=preg\u replace(“~(\p{Arabic}*\s*)~u”,“

    $1”,“$string”);


    您的第一个问题是您没有告诉它匹配
    ,所以它没有

    你的主要问题是空格不是阿拉伯语。只需添加与之匹配的备选方案即可解决您的问题:

    $text = preg_replace("~<p>(\p{Arabic}*|\s*)~u", "<p class=\"foo\">$1", $string);
    
    $text=preg\u replace(“~(\p{Arabic}*\s*)~u”,“

    $1”,“$string”);


    使用DOMDocument和DOMXPath:

    $html = <<<'EOD'
    <p>لمبارة وذ</p> 
    <p>خمس دقائق يخ</p> 
    <p>مراعاة إبقاء 3 لاعبين</p>
    EOD;
    
    libxml_use_internal_errors(true);
    
    $dom = new DOMDocument;
    $dom->loadHTML('<div>'.$html.'</div>', LIBXML_HTML_NOIMPLIED);
    
    $xpath = new DOMXPath($dom);
    
    // here you register the php namespace and the preg_match function
    // to be able to use it in the XPath query
    $xpath->registerNamespace("php", "http://php.net/xpath");
    $xpath->registerPhpFunctions('preg_match');
    
    // select only p nodes with at least one arabic letter
    $pNodes = $xpath->query("//p[php:functionString('preg_match', '~\p{Arabic}~u', .) > 0]");
    
    foreach ($pNodes as $pNode) {
        $pNode->setAttribute('class', 'foo');
    }
    
    $result = '';
    foreach ($dom->documentElement->childNodes as $childNode) {
        $result .= $dom->saveHTML($childNode);
    }
    
    echo $result;
    
    $html=registerNamespace(“php”http://php.net/xpath");
    $xpath->registerHPFunctions('preg_match');
    //仅选择至少包含一个阿拉伯字母的p节点
    $pNodes=$xpath->query(//p[php:functionString('preg_match','~\p{Arabic}~u',)>0]);
    foreach($pNodes作为$pNode){
    $pNode->setAttribute('class','foo');
    }
    $result='';
    foreach($dom->documentElement->childNodes作为$childNode){
    $result.=$dom->saveHTML($childNode);
    }
    回声$结果;
    
    使用DOMDocument和DOMXPath:

    $html = <<<'EOD'
    <p>لمبارة وذ</p> 
    <p>خمس دقائق يخ</p> 
    <p>مراعاة إبقاء 3 لاعبين</p>
    EOD;
    
    libxml_use_internal_errors(true);
    
    $dom = new DOMDocument;
    $dom->loadHTML('<div>'.$html.'</div>', LIBXML_HTML_NOIMPLIED);
    
    $xpath = new DOMXPath($dom);
    
    // here you register the php namespace and the preg_match function
    // to be able to use it in the XPath query
    $xpath->registerNamespace("php", "http://php.net/xpath");
    $xpath->registerPhpFunctions('preg_match');
    
    // select only p nodes with at least one arabic letter
    $pNodes = $xpath->query("//p[php:functionString('preg_match', '~\p{Arabic}~u', .) > 0]");
    
    foreach ($pNodes as $pNode) {
        $pNode->setAttribute('class', 'foo');
    }
    
    $result = '';
    foreach ($dom->documentElement->childNodes as $childNode) {
        $result .= $dom->saveHTML($childNode);
    }
    
    echo $result;
    
    $html=registerNamespace(“php”http://php.net/xpath");
    $xpath->registerHPFunctions('preg_match');
    //仅选择至少包含一个阿拉伯字母的p节点
    $pNodes=$xpath->query(//p[php:functionString('preg_match','~\p{Arabic}~u',)>0]);
    foreach($pNodes作为$pNode){
    $pNode->setAttribute('class','foo');
    }
    $result='';
    foreach($dom->documentElement->childNodes作为$childNode){
    $result.=$dom->saveHTML($childNode);
    }
    回声$结果;
    
    如果它不是阿拉伯语怎么办?@SimonKirsten那么它应该保持原样。我编辑了问题中的示例,请看。如果它不是阿拉伯语怎么办?@SimonKirsten,那么它应该保持原样。我编辑了问题中的示例,请参见。谢谢,但我在您发布的沙盒链接上看到了完全相同的问题。你确定它是正确的链接吗?错误的链接:就是这样:谢谢,但我在你发布的沙盒链接上看到了完全相同的问题。你确定它的链接是正确的吗?错误的链接:这就是它:
    $html = <<<'EOD'
    <p>لمبارة وذ</p> 
    <p>خمس دقائق يخ</p> 
    <p>مراعاة إبقاء 3 لاعبين</p>
    EOD;
    
    libxml_use_internal_errors(true);
    
    $dom = new DOMDocument;
    $dom->loadHTML('<div>'.$html.'</div>', LIBXML_HTML_NOIMPLIED);
    
    $xpath = new DOMXPath($dom);
    
    // here you register the php namespace and the preg_match function
    // to be able to use it in the XPath query
    $xpath->registerNamespace("php", "http://php.net/xpath");
    $xpath->registerPhpFunctions('preg_match');
    
    // select only p nodes with at least one arabic letter
    $pNodes = $xpath->query("//p[php:functionString('preg_match', '~\p{Arabic}~u', .) > 0]");
    
    foreach ($pNodes as $pNode) {
        $pNode->setAttribute('class', 'foo');
    }
    
    $result = '';
    foreach ($dom->documentElement->childNodes as $childNode) {
        $result .= $dom->saveHTML($childNode);
    }
    
    echo $result;