PHP 正则表达式:有选择地去除 HTML 标记之间的文本


PHP regex: Selectively strip text between HTML tags

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

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

<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>"

所以这就是我想做的 - 我想保留前两个<strong></strong>标签之间的文本,因为这是产品类别/标题,但<strong></strong>标签之间的所有后续文本只是标题,在搜索描述中没有用处,所以我想删除它。我已经找到了方法,从所有<strong></strong>标签之间剥离所有文本,但不是所有文本,而是第一个。

谢谢!

我会在这里推荐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->getShortDescription()填充:

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

您所需要的只是使用您找到的模式之一并将 preg_replace() 函数的 limit 参数设置为 1。请参阅文档。

您可以

简单地使用<strong>(.*)<'/strong>,然后替换为<strong><meta itemprop="description" content="$1">$1</strong>

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

(我不确定它是否对您的特定架构语法正确,但您明白了(。