Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php preg_替换字符串中的多个字段_Php_Regex - Fatal编程技术网

Php preg_替换字符串中的多个字段

Php preg_替换字符串中的多个字段,php,regex,Php,Regex,我有一个html字符串,其中包含以下多个部分: $source = ' <span id="pass_AwfpSYYUsn" data-id="AwfpSYYUsn" class="pointer unlockFieldChild" data-client="51" data-status="closed"><i class="fa fa-lock"></i> Show</span> <!-- OTHER HTML STUFF

我有一个html字符串,其中包含以下多个部分:

$source = '
    <span id="pass_AwfpSYYUsn" data-id="AwfpSYYUsn" class="pointer unlockFieldChild" data-client="51" data-status="closed"><i class="fa fa-lock"></i> Show</span>
    <!-- OTHER HTML STUFF -->
    <span id="pass_DbTD7TjEDX" data-id="DbTD7TjEDX" class="pointer unlockFieldChild" data-client="51" data-status="closed"><i class="fa fa-lock"></i> Show</span>
  ';

preg_replace的具体问题是什么?使用$1,$2。。。在替换字符串中插入捕获的内容:

preg_replace('%<span id="pass_(.*?)".*?data-client="(.*?)".*?</span>%', '[pass id="$1"]PASSWORD OR EMPTY[/pass]', $subject);

preg_replace('%Regex不是编辑html内容的方法。html太复杂,充满陷阱,无法获得可信的结果。PHP已经有一个基于libxml的内置html解析器:

$content = '
    <span id="pass_AwfpSYYUsn" data-id="AwfpSYYUsn" class="pointer unlockFieldChild" data-client="51" data-status="closed"><i class="fa fa-lock"></i> Show</span>
    <!-- OTHER HTML STUFF -->
    <span id="pass_DbTD7TjEDX" data-id="DbTD7TjEDX" class="pointer unlockFieldChild" data-client="51" data-status="closed"><i class="fa fa-lock"></i> Show</span>
  ';

$dom = new DOMDocument;
$state = libxml_use_internal_errors(true);
$dom->loadHTML('<div id="root">' . $content . '</div>'); // add a fake root element
// (usefull if you don't work with a full html document)
$xp = new DOMXPath($dom);
$nodeList = $xp->query('//span[starts-with(@id, "pass_")]');

foreach ($nodeList as $node) {
    $idpass = explode('_', $node->getAttribute('id'), 2)[1];

    $pw = '';
    if ($aG->getCanPassword()) {
        $p = $em->getRepository('AppBundle:PasswordList')->findOneBy(['code' => $idpass]);
        if ($p !== null) {
            $pw = $p->getPass();
        }
    }
    $textNode = $dom->createTextNode('[pass id="' . $idpass . '"]' . $pw . '[/pass]');
    $node->parentNode->replaceChild($textNode, $node);    
}

$content = '';
foreach($dom->getElementById('root')->childNodes as $childNode) {
    $content .= $dom->saveHTML($childNode);
}

libxml_use_internal_errors($state);

echo $content;
$content='1!'
显示
显示
';
$dom=新的DOMDocument;
$state=libxml\u使用\u内部错误(true);
$dom->loadHTML('.$content.'');//添加一个伪根元素
//(如果不使用完整的html文档,则此选项非常有用)
$xp=新的DOMXPath($dom);
$nodeList=$xp->query('//span[以(@id,“pass”)开头]);
foreach($nodelistas$node){
$idpass=explode(“”,$node->getAttribute('id'),2)[1];
$pw='';
如果($aG->getCanPassword()){
$p=$em->getRepository('AppBundle:PasswordList')->findOneBy(['code'=>$idpass]);
如果($p!==null){
$pw=$p->getPass();
}
}
$textNode=$dom->createTextNode(“[pass id=“”.$idpass.“]”.$pw.[/pass]”);
$node->parentNode->replaceChild($textNode,$node);
}
$content='';
foreach($dom->getElementById('root')->childNodes作为$childNode){
$content.=$dom->saveHTML($childNode);
}
libxml使用内部错误($state);
echo$内容;

使用XPath和/或DomDocument而不是正则表达式“任何提示都值得赞赏”。。。
$content = '
    <span id="pass_AwfpSYYUsn" data-id="AwfpSYYUsn" class="pointer unlockFieldChild" data-client="51" data-status="closed"><i class="fa fa-lock"></i> Show</span>
    <!-- OTHER HTML STUFF -->
    <span id="pass_DbTD7TjEDX" data-id="DbTD7TjEDX" class="pointer unlockFieldChild" data-client="51" data-status="closed"><i class="fa fa-lock"></i> Show</span>
  ';

$dom = new DOMDocument;
$state = libxml_use_internal_errors(true);
$dom->loadHTML('<div id="root">' . $content . '</div>'); // add a fake root element
// (usefull if you don't work with a full html document)
$xp = new DOMXPath($dom);
$nodeList = $xp->query('//span[starts-with(@id, "pass_")]');

foreach ($nodeList as $node) {
    $idpass = explode('_', $node->getAttribute('id'), 2)[1];

    $pw = '';
    if ($aG->getCanPassword()) {
        $p = $em->getRepository('AppBundle:PasswordList')->findOneBy(['code' => $idpass]);
        if ($p !== null) {
            $pw = $p->getPass();
        }
    }
    $textNode = $dom->createTextNode('[pass id="' . $idpass . '"]' . $pw . '[/pass]');
    $node->parentNode->replaceChild($textNode, $node);    
}

$content = '';
foreach($dom->getElementById('root')->childNodes as $childNode) {
    $content .= $dom->saveHTML($childNode);
}

libxml_use_internal_errors($state);

echo $content;