繁体   English   中英

从 PHP 中的字符串开头和结尾删除引号

[英]Remove quotes from start and end of string in PHP

我有这样的字符串:

"my value1" => my value1
"my Value2" => my Value2
myvalue3 => myvalue3 

我需要去掉" (双引号) 最后并开始,如果这些存在,但如果 String 中有这种字符,那么它应该留在那里。例如:

"my " value1" => my " value1

我如何在 PHP 中执行此操作 - 是否有此功能或我必须自己编写代码?

字面的答案是

trim($string,'"'); // double quotes
trim($string,'\'"'); // any combination of ' and "

它将从字符串中删除所有前导和尾随引号。

如果您需要严格删除第一个和最后一个引号以防它们存在,那么它可能是这样的正则表达式

preg_replace('~^"?(.*?)"?$~', '$1', $string); // double quotes
preg_replace('~^[\'"]?(.*?)[\'"]?$~', '$1', $string); // either ' or " whichever is found

如果仅在前导和尾随引号严格配对的情况下才需要删除,请使用Steve Chambers 的答案中的函数

但是,如果您的目标是从 CSV 文件中读取值,则fgetcsv是唯一正确的选项。 它将处理所有边缘情况,同时剥离价值外壳。

我有一个类似的需求,并编写了一个函数来从字符串中删除前导和尾随单引号或双引号:

/**
 * Remove the first and last quote from a quoted string of text
 *
 * @param mixed $text
 */
function stripQuotes($text) {
  return preg_replace('/^(\'(.*)\'|"(.*)")$/', '$2$3', $text);
} 

这将产生下面列出的输出:

Input text         Output text
--------------------------------
No quotes       => No quotes
"Double quoted" => Double quoted
'Single quoted' => Single quoted
"One of each'   => "One of each'
"Multi""quotes" => Multi""quotes
'"'"@";'"*&^*'' => "'"@";'"*&^*'

正则表达式演示(显示正在匹配/捕获的内容): https : //regex101.com/r/3otW7H/1

如果匹配您提供的模式, trim将从开头和结尾删除字符的所有实例,因此:

$myValue => '"Hi"""""';
$myValue=trim($myValue, '"');

会变成:

$myValue => 'Hi'.

这是一种仅删除匹配的第一个和最后一个字符的方法:

$output=stripslashes(trim($myValue));

// if the first char is a " then remove it
if(strpos($output,'"')===0)$output=substr($output,1,(strlen($output)-1));

// if the last char is a " then remove it
if(strripos($output,'"')===(strlen($output)-1))$output=substr($output,0,-1);

尽管这个线程早就应该被杀死,但我忍不住用我称之为最简单的答案来回应。 我注意到这个线程在 17 日重新出现,所以我对此并没有那么糟糕。 :)

使用 Steve Chambers 提供的样本;

echo preg_replace('/(^[\"\']|[\"\']$)/', '', $input);

输出如下;

Input text         Output text
--------------------------------
No quotes       => No quotes
"Double quoted" => Double quoted
'Single quoted' => Single quoted
"One of each'   => One of each
"Multi""quotes" => Multi""quotes
'"'"@";'"*&^*'' => "'"@";'"*&^*'

这只会删除第一个和最后一个引号,它不会重复删除额外的内容,也不关心匹配的结尾。

这是一篇旧帖子,但为了迎合多字节字符串,至少有两种可能的路线可以遵循。 我假设正在执行引号剥离,因为引号被视为程序/INI 变量,因此是“某物”或“某物”但不是“混合引号”。此外,匹配引号之间的任何内容都是完好无损。
路线 1 - 使用正则表达式

function sq_re($i) {
    return preg_replace( '#^(\'|")(.*)\1$#isu', '$2', $i );
}

这使用 \\1 来匹配与开头匹配的相同类型的引号。 u 修饰符,使其支持 UTF8(好吧,不完全支持多字节)


路线 2 - 使用 mb_* 函数

function sq($i) {
    $f = mb_substr($i, 0, 1);
    $l = mb_substr($i, -1);
    if (($f == $l) && (($f == '"') || ($f == '\'')) ) $i = mb_substr($i, 1, mb_strlen( $i ) - 2);
    return $i;
}

你需要使用正则表达式,看看:-

http://php.net/manual/en/function.preg-replace.php

或者,在这种情况下,您可以使用 substr 检查字符串的第一个字符和最后一个字符是否是引号,如果是,则截断字符串。

http://php.net/manual/en/function.substr.php

正则表达式怎么样

//$singleQuotedString="'Hello this 'someword' and \"somewrod\" stas's SO";
//$singleQuotedString="Hello this 'someword' and \"somewrod\" stas's SO'";
$singleQuotedString="'Hello this 'someword' and \"somewrod\" stas's SO'";

$quotesFreeString=preg_replace('/^\'?(.*?(?=\'?$))\'?$/','$1' ,$singleQuotedString);

输出

Hello this 'someword' and "somewrod" stas's SO   

如果您更喜欢性能而不是清晰度,则可以这样做:

// Remove double quotes at beginning and/or end of output
$len=strlen($output);
if($output[0]==='"') $iniidx=1; else $iniidx=0;
if($output[$len-1]==='"') $endidx=-1; else $endidx=$len-1;
if($iniidx==1 || $endidx==-1) $output=substr($output,$iniidx,$endidx);

注释有助于清晰......在字符串上类似数组的用法中的括号是可能的,并且比等效方法需要更少的处理工作,太糟糕了没有长度变量或最后一个字符索引

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM