【问题标题】:PHP regex: Selectively strip text between HTML tagsPHP regex:有选择地去除 HTML 标签之间的文本
【发布时间】:2013-12-04 23:42:59
【问题描述】:

我正在向我们的产品页面添加架构(描述),所有这些都是动态生成的,因此我希望添加一个良好的通用正则表达式来正确格式化所述描述。

这就是我目前正在使用的内容(为了便于阅读,间距有点奇怪):

<meta itemprop="description" content="
    <?php 
        $original_desc = $_product->getShortDescription();
        $schema_desc = preg_replace('Rocking REGEX theoretically goes here','$1 $2', $original_desc);
        strip_tags($schema_desc);
        echo $schema_desc; 
    ?>
">

问题是,我们的产品描述是从 CMS 的管理员中提取的,所以格式有点松散。

这是他们的样子:

 content="<p><strong>Product Title</strong> - Other Product Name - <em>Blah Blah</em></p>
 <p><strong>Product Heading 1</strong> </p>
 <p><strong>Product Heading 2:</strong>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vulputate pellentesque sem, id mattis sem blandit at. 
    Suspendisse tempus sodales enim nec aliquam. Vestibulum laoreet tincidunt dui, sit amet laoreet ipsum gravida at. Nulla in tempus justo, 
    et bibendum dolor.</p>
    <p><strong>Product Heading 3:</strong> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vulputate pellentesque 
    sem, id mattis sem blandit at. Suspendisse tempus sodales enim nec aliquam. Vestibulum laoreet tincidunt dui, sit amet laoreet ipsum gravida at. 
    Nulla in tempus justo, et bibendum dolor.</p>"

所以这就是我想要做的 - 我想保留前两个 &lt;strong&gt;&lt;/strong&gt; 标签之间的文本,因为那是产品类别/标题,但 &lt;strong&gt;&lt;/strong&gt; 标签之间的所有后续文本只是没有用处的标题在搜索描述中,所以我想将其删除。我已经找到方法说,从所有 &lt;strong&gt;&lt;/strong&gt; 标记之间删除所有文本,但不是第一个。

谢谢!

【问题讨论】:

    标签: php html regex schema preg-replace


    【解决方案1】:

    我会在这里推荐 DomDocument

    $str = <<<STR
    <p><strong>Product Title</strong> - Other Product Name - <em>Blah Blah</em></p>
     <p><strong>Product Heading 1</strong> </p>
     <p><strong>Product Heading 2:</strong>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vulputate pellentesque sem, id mattis sem blandit at. 
        Suspendisse tempus sodales enim nec aliquam. Vestibulum laoreet tincidunt dui, sit amet laoreet ipsum gravida at. Nulla in tempus justo, 
        et bibendum dolor.</p>
        <p><strong>Product Heading 3:</strong> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vulputate pellentesque 
        sem, id mattis sem blandit at. Suspendisse tempus sodales enim nec aliquam. Vestibulum laoreet tincidunt dui, sit amet laoreet ipsum gravida at. 
        Nulla in tempus justo, et bibendum dolor.</p>
    STR;
    
    $dom = new DOMDocument();
    @$dom->loadHTML($str);
    $elements = $dom->getElementsByTagName('strong');
    
    echo $elements->item(0)->nodeValue;
    echo '<br>';
    echo $elements->item(1)->nodeValue;
    

    输出:

    Product Title
    Product Heading 1
    

    编辑:

    如果我理解正确,$str$_product-&gt;getShortDescription() 填充:

    $dom = new DOMDocument();
    @$dom->loadHTML($_product->getShortDescription());
    $elements = $dom->getElementsByTagName('strong');
    
    echo $elements->item(0)->nodeValue;
    echo '<br>';
    echo $elements->item(1)->nodeValue;
    

    【讨论】:

    • 这看起来很有趣,也许这是一个愚蠢的问题,但鉴于描述的值是动态提取的(通过$_product-&gt;getShortDescription()),我将如何合并您推荐的标记?跨度>
    【解决方案2】:

    您只需使用您找到的模式之一并将preg_replace() 函数的limit 参数设置为1。See the documentation

    【讨论】:

    • 不设置参数限制为一个意味着preg_replace在第一次匹配后停止?
    • @Kale:是的。如果没有找到好的模式,可以使用'~&lt;strong&gt;[^&gt;]+&gt;~'
    【解决方案3】:

    您可以简单地使用&lt;strong&gt;(.*)&lt;\/strong&gt;,然后替换为&lt;strong&gt;&lt;meta itemprop="description" content="$1"&gt;$1&lt;/strong&gt;

    这是一个工作示例:http://regex101.com/r/dV9wJ5

    (我不确定它在语法上是否适合您的特定架构,但您明白了)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 2011-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多