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

时间:2013-12-04 23:42:59

标签: php html regex schema preg-replace

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

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

<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>标签之间删除所有文本,但不是除了第一个之外的所有文本。

谢谢!

3 个答案:

答案 0 :(得分: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->getShortDescription()

$dom = new DOMDocument();
@$dom->loadHTML($_product->getShortDescription());
$elements = $dom->getElementsByTagName('strong');

echo $elements->item(0)->nodeValue;
echo '<br>';
echo $elements->item(1)->nodeValue;

答案 1 :(得分:0)

您只需使用您找到的其中一种模式,并将preg_replace()函数的限制参数设置为1. See the documentation

答案 2 :(得分:0)

您只需使用<strong>(.*)<\/strong>,然后替换为<strong><meta itemprop="description" content="$1">$1</strong>

即可

以下是一个有效的例子:http://regex101.com/r/dV9wJ5

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