【问题标题】:How to replace some special characters?如何替换一些特殊字符?
【发布时间】:2021-04-23 22:02:37
【问题描述】:

我有一个 PHP 代码将连接到数据库,选择一个表,然后从中获取数据。在我的一个列(名为title)中,我的数据如下:Hello World - This/That is (Test) 但我想转换这个:hello-world-this-that-is-test 因为我想在我的 页面 URL 中使用这种文本。

我的意思是我需要

  1. 删除空格
  2. 删除双或多个破折号
  3. 删除斜杠和反斜杠
  4. 去掉括号(和)

并且想用我上面写的只用一个破折号替换所有这些。换句话说,我想删除所有特殊字符并将它们转换为只有一个破折号

目前我的代码可以删除空格和双破折号,但不能删除斜杠和括号。这是我的代码:

<?php 
 define('DBHOST','localhost');
 define('DBUSER','user');
 define('DBPASS','pass');
 define('DBNAME','name');

$db = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);
$db->set_charset('utf8mb4');
if(!$db){
 die( "Sorry! There seems to be a problem connecting to our database.");
}

$myFile = "sitemap.xml";
$fh = fopen($myFile, 'w') or die("can't open file"); 
$rss_txt = null;

$rss_txt .= '<?xml version="1.0" encoding="UTF-8"?>';
$rss_txt .= '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">';

$query = mysqli_query($db, "SELECT * FROM posts_articles ORDER BY post_id ASC");
while($values_query = mysqli_fetch_assoc($query)) {
    $rss_txt .= '<url>';
    $rss_txt .= '<loc>https://example.com/blogs/'.$values_query["post_id"].'/'.$var = preg_replace("/[\s-]+/", "-", $values_query["title"]).'</loc>';
    $rss_txt .= '<changefreq>weekly</changefreq>';
    $rss_txt .= '<priority>0.7</priority>';
    $rss_txt .= '</url>';
}

$rss_txt .= '</urlset>';

fwrite($fh, $rss_txt);
fclose($fh);

?>

好的。我的这部分代码必须得到 title '.$var = preg_replace("/[\s-]+/", "-", $values_query["title"]).' 这个代码可以删除空格和多个破折号,只剩下一个破折号。有用!但是如果标题栏有括号或斜线,它不能删除它们,我的代码会失败。

我对 PHP 和 SQL 非常陌生,所以不要怪我。我必须开始学习,但在阅读了 50 多篇文章后,我找不到任何有用的东西来做我想做的事。

【问题讨论】:

  • 正则表达式很难。也许尝试这样的事情: preg_replace("/([\s()\/\-])+(\-?)+/", "-", $values_query["title"]);我只在 regex101.com 上测试过它
  • 如果您的问题与字符串操作有关,请专注于此。我们不需要从数据库中检索数据的所有代码。见minimal reproducible example

标签: php preg-replace


【解决方案1】:

这是一个使用三个独立的正则表达式对字符串进行连续转换的解决方案:


<?php

$regex1 = "/[^0-9a-z\s]+/i";        // Search for everything that is not alphanumeric or whitespace
$regex2 = "/\s+/";                  // Search for whitespace
$regex3 = "/-+$/";                  // search for trailing dashes

$text = "Hello World - This/That is (Test)";

// replace in turn, non-alpha with space, one or more spaces with dash,
// one or more trailing dashes with nothing 
$text2 = preg_replace([$regex1, $regex2, $regex3],[' ','-',''], $text);

// Switch everything to lower case
$text2 = strtolower($text2);

echo $text2;       // hello-world-this-that-is-test

演示:https://3v4l.org/Pe5hC

(正则表达式纯粹主义者可能能够进一步浓缩这一点,但这是清晰且易于修改的)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 2017-08-12
    • 2011-12-28
    • 1970-01-01
    • 2014-11-03
    • 2020-12-11
    相关资源
    最近更新 更多