使用PHP和正则表达式进行条件搜索和替换

使用PHP和正则表达式进行条件搜索和替换,php,regex,Php,Regex,我需要在HTML文件中隐藏所有具有内联样式且“左”偏移量为400或更大的“p”标记 我希望一些聪明的正则表达式能将“left:XXX”替换为“display:none”,如果“XXX”大于等于400 例如,这: <p style="position:absolute;top:98px;left:472px;white-space:nowrap"> 非常感谢您的任何建议!:) Wonko不要相信regex能解决世界上所有的问题: 使用DOMDocument提取带有style属性的p标

我需要在HTML文件中隐藏所有具有内联样式且“左”偏移量为400或更大的“p”标记

我希望一些聪明的正则表达式能将“left:XXX”替换为“display:none”,如果“XXX”大于等于400

例如,这:

<p style="position:absolute;top:98px;left:472px;white-space:nowrap">
非常感谢您的任何建议!:)


Wonko

不要相信regex能解决世界上所有的问题:

使用DOMDocument提取带有style属性的p标记,从style属性中提取带有正则表达式模式的“left”值,然后在“left”值大于或等于400时进行替换(通过简单比较进行测试)


我已经对其进行了测试,并且工作正常:

$string = '<p style="position:absolute;top:98px;left:472px;white-space:nowrap">';

 $test = str_replace('left:', 'display:none;[', $string );
 $test = str_replace('white-space', ']white-space', $test );
 $out = delete_all_between('[', ']', $test);
 print($out); // output

function delete_all_between($beginning, $end, $string) {
  $beginningPos = strpos($string, $beginning);
  $endPos = strpos($string, $end);
  if ($beginningPos === false || $endPos === false) {
    return $string;
  }

  $textToDelete = substr($string, $beginningPos, ($endPos + strlen($end)) - $beginningPos);

  return str_replace($textToDelete, '', $string);
}
$string='

; $test=str_replace('left:','display:none;[',$string); $test=str_replace('white-space',']white-space',$test); $out=delete_all_-between('[',']',$test); 打印($out);//输出 函数delete_all_between($start,$end,$string){ $beginningPos=strpos($string,$beging); $endPos=strpos($string,$end); 如果($beginningPos==false | |$endPos==false){ 返回$string; } $textToDelete=substr($string,$beginningPos,($endPos+strlen($end))-$beginningPos); 返回str_replace($textToDelete,,$string); }

输出:

<p style="position:absolute;top:98px;display:none;white-space:nowrap">


享受吧

你到底想要什么?!您想替换第2行而不是第1行吗?问得好,法蒂梅,谢谢您的提问。如果“xxx”大于400,我需要将“left:xxx”替换为“display:none”。@WonkotheSane抱歉,堆栈溢出不是代码编写服务。您需要首先编写代码,展示解决问题的重大尝试,并展示您所做的任何研究。您还需要详细解释当前代码的问题是什么,以便回答问题的人更清楚。你可以在网上看到这一切。如果你想简单地为你编写代码,我建议你雇佣一个自由程序员。现在,你说大于400,在它被偏移400或更多之前。具体要求是什么?很高兴知道,谢谢匿名。哇,它工作得很好。我决不会想到这个文件。谢谢你让我走上正轨,你真厉害!我不明白什么是
$m
?@Fatemeh:
$m
是匹配数组,索引0是整个匹配,其他索引是捕获组(第一个为1,第二个为2,等等)。啊哈,但是$m[1]表示在匹配中发现了一个错误?@Fatemeh:No,
$m[1]
是模式中这些括号之间捕获的内容:
(\d+)
(因此它是“left”参数的值,即数字)。
$dom = new DOMDocument;
$dom->loadHTML($html);

$pTags = $dom->getElementsByTagName('p');

foreach($pTags as $pTag) {
    if ($pTag->hasAttribute('style')) {
        $style = $pTag->getAttribute('style');
        $style = preg_replace_callback(
            '~(?<=[\s;]|^)left\s*:\s*(\d+)\s*px\s*(?:;|$)~i',
            function ($m) {
                return ($m[1] > 399) ? 'display:none;' : $m[0];
            },
            $style
        );
        $pTag->setAttribute('style', $style);
    }
}

$result = $dom->saveHTML();
$style = preg_replace_callback(
    '~(?<=[\s;]|^)left\s*:\s*(\d+)\s*px\s*(;.*|$)~i',
    function ($m) {
        return ($m[1] > 399) ? $m[2]. 'display:none;' : $m[0];
    },
    $style
);
$string = '<p style="position:absolute;top:98px;left:472px;white-space:nowrap">';

 $test = str_replace('left:', 'display:none;[', $string );
 $test = str_replace('white-space', ']white-space', $test );
 $out = delete_all_between('[', ']', $test);
 print($out); // output

function delete_all_between($beginning, $end, $string) {
  $beginningPos = strpos($string, $beginning);
  $endPos = strpos($string, $end);
  if ($beginningPos === false || $endPos === false) {
    return $string;
  }

  $textToDelete = substr($string, $beginningPos, ($endPos + strlen($end)) - $beginningPos);

  return str_replace($textToDelete, '', $string);
}
<p style="position:absolute;top:98px;display:none;white-space:nowrap">