preg_replace允许一切?

时间:2014-02-01 23:11:12

标签: php

我试图找到一种方法,以便preg_replace允许URL中的所有内容....

目前我的代码允许space/alphabetical个字符....

首先,我需要知道是否有办法允许一切,我的意思是preg_replace中的每个字符?

如果没有,那么我需要允许+-以及_'以及++基本上所有特殊字符?

这是我目前的代码:

$category = preg_replace('/[^i<>@&\/\sA-Za-z0-9_]/', '', $_GET['category']);

有人可以帮我解决这个问题吗?

提前致谢

编辑:抱歉,我应该更好地解释一下:

我正在网上商店PHP / mysql ...

我正在尝试在类别列表页面中显示每个类别下的产品。

例如:

当有人点击类别1时,类别1下的产品将是p1,p2,p3等,它们将从mysql数据库中提取出来,如下所示:

<?php 
if (isset($_GET['category'])) {
// Run a select query to get my letest 6 items
// Connect to the MySQL database  
include "config/connect.php";


$category = preg_replace('/[^i<>@&\/\sA-Za-z0-9_]/', '', $_GET['category']);



$cList2 = "";
$sql = "SELECT * FROM products WHERE category='".$category."'  LIMIT 35" ;
$query = mysqli_query($db_conx, $sql);
$productCount = mysqli_num_rows($query); // count the output amount
if ($productCount > 0) {
    while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){ 
             $id = $row["id"];
             $product_name = $row["product_name"];
             $price = $row["price"];
             $category = $row["category"];
             $details = $row["details"];
             $stock = $row["stock"];
             $date_added = strftime("%b %d, %Y", strtotime($row["date_added"]));
             $cList2 .= '<table  style="border:solid 1px #EBEBEB; margin-top:10px;" width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td width="3%">&nbsp;</td>
    <td width="21%"><a href="product.php?id=' . $id . '"><img style="border:solid 1px #E2E2E2; margin:10px;" src="inventory_images/' . $id . 'Image1.jpg" width="124" height="124" /></a></td>
    <td width="4%"><div style="border-right:solid 1px #E2E2E2; width:2px; height:120px; margin-left:5px;"></div></td>
    <td valign="top" width="48%"><table style="margin-left:10px;" width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td>&nbsp;</td>
      </tr>
      <tr>
        <td style="font-size:16px; font-weight:bold;"><a href="product.php?id=' . $id . '">' . $product_name . '</a></td>
      </tr>
            <tr>
        <td><div style="font-weight:normal; text-align:left; height:90px; overflow:hidden; margin-top:10px;">' . $details . '</div></td>
      </tr>
    </table></td>
    <td valign="top" width="24%"><table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td height="40"><strong style="color:#999;">Price:</strong> £' . $price . '<br/>' . $stock . '</td></td>
  </tr>
  <tr>
    <td><form method="post" action="product.php?id=' . $id . '"><input type="submit" class="button" name="button" id="button" value="Add to cart" /></form></td>
  </tr>
</table>
</td>
  </tr>
</table>';
    }
}
} else {
    $cList2 = "We have no products listed in our store yet";
}

?>

因此,某些类别名称包含一些特殊字符,例如+符号或-符号或++符号等...目前具有+符号的类别{ {1}}符号或++符号不会在类别列表页面中显示其产品但是当我删除-符号或+符号等时,他们会正确显示其产品!

这就是我想要解决的问题。

编辑:这是我如何添加/插入我的产品到db:请忽略mysql查询,因为我将完成其余的生产后将其更改为mysqli ....

-

1 个答案:

答案 0 :(得分:0)

默认情况下,所有内容都包含在字符串中。您没有从一开始就告诉我们您要将此字符串放入数据库中,然后将其解压缩以显示给用户。

在这种情况下,你不需要打破查询字符串,同时也不要显示像\'这样的转义引号我们都是用户,我们都知道没有人希望他的名字是{{1 }}

我看到她的最快方法是将特殊字符解码为实体,然后以他希望他们看到的方式将其输出回用户。

逻辑流程很简单。例如:用户输入整数O\'Brian但由于某种原因{}不允许使用5字符。您的密码系统会发出警报并进行简单加密,您可以向其添加5。所以你在db中插入整数+1。当您稍后提取此字符时,您知道它已加密,您只需从中减去6即可对其进行解密。所以你再次输出5。

非常粗略的例子

-1

在此示例中,您可以在不中断查询字符串的情况下查询数据库,因为发送了原始引号,并且您可以毫无问题地向用户输出已解码的值 - 如果您尝试打印实体,它们将显示为特殊字符最终用户,但不会以数据库形式插入数据库。

点击此处http://php.net/htmlentitieshttp://php.net/manual/en/function.html-entity-decode.php