Php preg_替换字符串中的多个字段
我有一个html字符串,其中包含以下多个部分: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
$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;