php preg_replace没有结果和错误但没有错误消息

时间:2016-09-05 05:59:31

标签: php regex preg-replace

运行时以下代码,我的php脚本未运行且未显示错误消息。

<?php
    $content = '<p>Hi </p> <p>The post <a rel="nofollow" href="http://sample.com/article/2016/09/05/%d8%a7%d9%84-%d8%ac%db%8c-%d9%82%d8%b5%d8%af-%d8%af%d8%a7%d8%b1%d8%af-%d8%b3%d8%b1%d9%85%d8%a7%db%8c%d9%87-%da%af%d8%b0%d8%a7%d8%b1%db%8c-%d8%b9%d8%b8%db%8c%d9%85%db%8c-%d8%b1%d8%a7-%d8%af%d8%b1/" ><b>ال جی قصد دارد سرمایه گذاری عظیمی را در حوزه رباتیک انجام دهد</b></a> appeared first on <a rel="nofollow" href="http://sample.com" ><b>بهنام</b></a>.</p>';
    $content = preg_replace('/(The post)+(.)+(appeared first)+(.)+(\.)*/i', '', $content);
    echo $content;

我想从“帖子”中删除所有内容,直到结束点 - 来自内容变量字符串。

我的目标是动态删除

The post <a rel="nofollow" href=""><b>ال جی قصد دارد سرمایه گذاری عظیمی را در حوزه رباتیک انجام دهد</b></a> appeared first on <a rel="nofollow" href="http://sample.com" ><b>بهنام</b></a>. 

从内容结尾(RSS描述)。

我认为这个问题是因为$ content的值是unicode(波斯语)。

从内容变量中删除链接的href时输出为真。

5 个答案:

答案 0 :(得分:1)

请检查此方法是否适合您。

$content = preg_replace('|<p>The post(.)*|', '', $content);

我的第一个解决方案:

$contentToReplace[] = '/The post/';
$contentToReplace[] = '/appeared first on/';

$content = preg_replace($contentToReplace, '', $content);

答案 1 :(得分:1)

请尝试

$content = '<p>Hi </p> <p>The post <a rel="nofollow" href=""><b>ال جی قصد دارد سرمایه گذاری عظیمی را در حوزه رباتیک انجام دهد</b></a> appeared first on <a rel="nofollow" href="http://sample.com" ><b>بهنام</b></a>.</p>';
$result = preg_replace(
          array('/The post/', '/appeared first on/'),
          array('', ''),
          $content
);
echo $result;

答案 2 :(得分:0)

$content = preg_replace('/The post(.)*/i', '', $content);

满足你想要的东西。 .表示除换行之外的所有内容,因此您不需要所有这些额外的漏洞。

答案 3 :(得分:0)

使用更优越的DOM方法:

<?php

$data = <<<DATA
<p>Hi </p> <p>The post <a rel="nofollow" href="http://sample.com/article/2016/09/05/%d8%a7%d9%84-%d8%ac%db%8c-%d9%82%d8%b5%d8%af-%d8%af%d8%a7%d8%b1%d8%af-%d8%b3%d8%b1%d9%85%d8%a7%db%8c%d9%87-%da%af%d8%b0%d8%a7%d8%b1%db%8c-%d8%b9%d8%b8%db%8c%d9%85%db%8c-%d8%b1%d8%a7-%d8%af%d8%b1/" ><b>ال جی قصد دارد سرمایه گذاری عظیمی را در حوزه رباتیک انجام دهد</b></a> appeared first on <a rel="nofollow" href="http://sample.com" ><b>بهنام</b></a>.</p>
DATA;

$dom = new DOMDOcument();
$dom->loadHTML($data, LIBXML_HTML_NOIMPLIED); 
$dom->removeChild($dom->doctype);

$xpath = new DOMXPath($dom);

$elements_to_be_removed = $xpath->query("//p[starts-with(text(), 'The post ')]");
foreach ($elements_to_be_removed as $element) {
    $element->parentNode->removeChild($element);
}

// just to check
echo $dom->saveHTML();
# <p>Hi </p>
?>

这会删除文字以&#34开头的每个p;帖子&#34;。

答案 4 :(得分:0)

正确的解决方案是:

import UIKit
class MyCollectionViewCell: UICollectionViewCell {
override var selected: Bool {
    didSet {
        contentView.backgroundColor = selected ? UIColor.redColor(): UIColor.blueColor()
    }
}
}

class ViewController: UIViewController {
@IBOutlet var collView: UICollectionView!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 5
}

// make a cell for each cell index path
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    // get a reference to our storyboard cell
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("MyCollectionViewCell", forIndexPath: indexPath) as! MyCollectionViewCell
    if(indexPath.row == 0) { //for first cell in the collection
        cell.backgroundColor = UIColor.redColor()
    } else {
        cell.backgroundColor = UIColor.blueColor()
    }

    return cell
}

}

感谢wiktor-stribiżew