用指向PHP中相同域的链接替换纯文本

时间:2019-05-25 18:33:09

标签: php preg-replace str-replace

我正在用链接替换纯文本,但不能正确执行。

我尝试了color函数,但似乎根本无法解决我的问题。

select('partners_vehicles.id', 'partners_vehicles.year', 'vehicle_makes.make AS `make`', 'partners_vehicles.model', 'vehicle_colors.color', 'partners_vehicles.created_at')

请注意,三个链接来自同一域/** * Gets Sheet by its name from a Spreadsheet (by id); * @param {String} id Spreadsheet's id; * @param {String} name Sheet name; * returns {Sheet} this sheet; */ function getSheet(id,name) { var ss = SpreadsheetApp.openById(id); var sh = ss.getSheetByName(name); return sh; } //test function; function testInsert() { var sh = getSheet('yourSpreadsheetId','yourSheetName'); var data = [1,2,3,4,5,7]; //an array of values; insert(sh,data,1); } /** * Inserts values to the last row; * @param {Sheet} sheet to use; * @param {Array} array of values to set; * @param {Integer} startCol column to start from; */ function insert(sheet,data,startCol) { var lrow = sheet.getLastRow(); var lrange = sheet.getRange(lrow,startCol,1,data.length) lrange.setValues([data]); } ,因此在替换第一个链接时,其他链接也是如此。

preg_replace()循环用于我需要为每个链接执行的功能(我不写它,因为它现在不重要了。)

我希望能够单独使用所有链接,并且共享域的链接不会互相踩踏。

我得到的输出:

$string = 'This is a message with multiple links: http://google.com http://twitter.com http://google.com/qwerty http://facebook.com http://google.com/ytrewq';

preg_match_all('/(^|\s)((http(s)?\:\/\/)?[\w-]+(\.[\w-]+)+[^\s]*[^.,\s])/u', $string, $url);

$links = $url[2];

foreach($links as $link){
    $final_string = str_replace($link, '<a href="'.$link.'">'.$link.'</a>', $string);
}

echo $final_string;

我希望输出:

http://google.com

2 个答案:

答案 0 :(得分:0)

您应该使用preg_replace_callback()来简化操作。

尝试:

$string = 'This is a message with multiple links: ';
$string .= 'http://google.com ';
$string .= 'http://twitter.com ';
$string .= 'http://google.com/qwerty ';
$string .= 'http://facebook.com ';
$string .= 'http://google.com/ytrewq ';

$final_string = preg_replace_callback(
    "/(^|\s)((http(s)?\:\/\/)?[\w-]+(\.[\w-]+)+[^\s]*[^.,\s])/",
    function ( $matches ) {
        $link = trim( $matches[0] );

        return " <a href='$link'>$link</a>";
    },
    $string
);

echo $final_string;

我更改了您声明$string的方式,只是为了使其更易于阅读,但这没关系。
另外,请注意,您不需要像正使用的u一样在正则表达式中使用任何标志。顺便说一句,这是错误的,应该是U,而不是u
希望对您有所帮助。

答案 1 :(得分:-1)

你要踢自己。

$string = 'This is a message with multiple links: http://google.com http://twitter.com http://google.com/qwerty http://facebook.com http://google.com/ytrewq';

preg_match_all('/(^|\s)((http(s)?\:\/\/)?[\w-]+(\.[\w-]+)+[^\s]*[^.,\s])/u', $string, $url);

$links = $url[2];

foreach($links as $link) {
    $string = str_replace($link, '<a href="'.$link.'">'.$link.'</a>', $string);
}

echo $string;

您正在覆盖$ final_string而不是替换$ string。