从网址中删除撇号

时间:2018-06-22 15:25:06

标签: php arrays url

[编辑] ,我将在此帖子底部附近输入的评论放入此处,希望避免进一步的否决。 这是一个非常基本的问题,是由于我误解了$ _REQUEST到底是什么。我的理解是,这是一个引用$ _POST和$ _GET(和$ _COOKIE)的索引。但是,我发现$ _REQUEST本身就是一个数组,因此我只是更改了$ _REQUEST中的变量。尽管如此,这不是一个最佳解决方案,而是一个解决方案。它还有一个优点,就是$ _GET变量仍然带有撇号。也许这不是最佳做法,但请在投票前注意,我对这些数据几乎没有控制-从一个API传入另一个API。

我有一个正在使用的API。我们有些客户在URL中发送撇号时遇到问题。我的问题是如何最好地去除URL数组中的撇号。也许使用array_walk或类似的东西?

这样$_REQUEST[Customer] == "O'Henry's"
成为$_REQUEST[Customer] == "OHenrys"

编辑:从这里的一些答案来看,我认为我需要更好地解释。这是一个已经编写的API,是另一个AS400 API的初步接口。我与构建URL无关。我收到了我所关心的是在不更改任何其他代码的情况下删除撇号。因此,最好的方法是遍历数组。在代码主体中,变量引用全部使用$ _REQUEST []。如果有绝对必要,我可以将其更改为$ _GET [],但宁愿避免这种情况。

这有效

foreach($_REQUEST as $idx => $val)
{
    $_REQUEST[$idx] = str_replace("'" , '' , $val);
}

但是,我有点以这种方式使用$ _REQUEST。有谁看到这个问题。 (用$ _GET替换$ _REQUEST无效)

4 个答案:

答案 0 :(得分:2)

对于某些用例,可能需要存储名称的“纯净”或“漂亮”版本。在这种情况下,您可能需要标准化一种情况,并使用字符白名单而不是仅包含单引号的黑名单。使用正则表达式来强制执行此操作,perhaps similar to this one

preg_replace("/[^[:alnum:][:space:]]/u", '', $string);

如果这样做,请考虑是否有必要区分名为O'HenrysO'Henry'sOHenrysO'henry's等的不同客户。确保您的约束由应用程序和数据库强制执行。

array_walk_recursive函数是敲击数组中每个项目的合理方法:

function sanitize(&$item, $key)
{
    if (is_string($item)) {
        // apply whitelist constraints
    }
}

array_walk_recursive($array, 'sanitize');

没有更多的上下文很难说,但是似乎您可能会问错问题/解决错误的问题。

请记住,您几乎总是可以转义“特殊”字符并将其变为非问题。

在HTML上下文中,单引号可能会引起问题(例如,单引号表示的属性值),请使用htmlspecialchars或特定于库的替代方法对HTML进行转义:

<?php
// some stuff
$name = "O'Henry's";
?><a data-customer='<?=htmlspecialchars($name, ENT_QUOTES|ENT_HTML5);?>'>whatever</a><?php
// continue

对于JavaScript,请使用json_encode进行编码:

<?php
// some stuff
$name = "O'Henry's";
?><script>
    var a = <?=json_encode($name);?>
    alert(a); // O'Henry's
</script>

对于SQL,请使用PDO和prepared statement

$dbh = new PDO('mysql:host=localhost;dbname=whatever', $user, $pass);
$name = "O'Henry's";
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name) VALUES (:name)");
$stmt->bindParam(':name', $name);
$stmt->execute();

要在URL查询字符串中使用,请使用urlencode

<?php
// some stuff
$name = "O'Henry's";
?><a href="https://example.com/path/?var=<?=urlencode($name);?>">whatever</a><?php
// continue

要在URL查询路径中使用,请使用rawurlencode

<?php
// some stuff
$name = "O'Henry's";
?><a href="https://example.com/clients/<?=rawurlencode($name);?>/reports/">whatever</a><?php
// continue

库和框架将提供在这些或其他上下文中逃避事物的其他方式。

答案 1 :(得分:1)

如果您希望他们将其完全删除为非法字符:

<?php foreach($myArray as $idx => $val){ 

    $myArray[$idx] = str_replace("'" , '' , $val);

 }
 ?>

但是,这不应该是您解决SQL插入等问题的方法。最好使用mysqli::real_escape_string或准备好的语句

答案 2 :(得分:0)

编辑:
阅读您对问题所做的编辑后,str_replace()是您的最佳解决方案。但是无需遍历数组,第三个参数可以是数组!
这将去除$foo中每个项目的撇号:

$foo = [
    "O'Henry's",
    "D'Angleterre"
];
$foo = str_replace("'", "", $foo);


如果您确实需要删除撇号,请使用str_replace()

$foo = "O'Henry's";
$foo = str_replace("'", "", $foo);
// OUTPUT: OHenrys

如果可以保留它们,则最好对其进行编码。 urlencode()可能是一种方法:

$foo = urlencode($foo);
// OUTPUT: O%27Henry%27s

如果您从数组中构建此URL,则可以使用http_build_query()

$foo = [
    'Customer' => "O'Henry's"
];
$foo = http_build_query($foo);
// OUTPUT: Customer=O%27Henry%27s

答案 3 :(得分:0)

这是一个非常基本的问题,源于我对$ _REQUEST到底是什么的误解。我的理解是,这是一个引用$ _POST和$ _GET(和$ _COOKIE)的索引。但是,我发现$ _REQUEST本身就是一个数组,因此我只是更改了$ _REQUEST中的变量。尽管如此,这不是一个最佳解决方案,而是一个解决方案。它还有一个优点,就是$ _GET变量仍然带有撇号。不过,这不是最佳做法。