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

cgfeq70w  于 2023-03-11  发布在  PHP
关注(0)|答案(8)|浏览(185)

我有这样的字符串:

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

我需要去掉end和start中的"(双引号),如果它们存在的话,但是如果String中有这种字符,那么它应该留在那里。

"my " value1" => my " value1

我怎么能在PHP中做到这一点-有函数吗?还是我必须自己编写代码?

rvpgvaaj

rvpgvaaj1#

字面上的答案应该是

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' answer中的函数
但是,如果您的目标是从CSV文件中读取值,那么fgetcsv是唯一正确的选项,它将处理所有的边缘情况,同时剥离值封装。

yh2wf1be

yh2wf1be2#

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

/**
 * 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
'"'"@";'"*&^*'' => "'"@";'"*&^*'

Regex演示(显示匹配/捕获的内容):https://regex101.com/r/3otW7H/8

hujrc8aj

hujrc8aj3#

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);
mccptt67

mccptt674#

虽然这个帖子早就应该被删除了,但我还是忍不住给出了一个我称之为最简单的答案。我注意到这个帖子在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
'"'"@";'"*&^*'' => "'"@";'"*&^*'

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

xxslljrj

xxslljrj5#

这是一个老帖子,但仅仅为了迎合多字节字符串,至少有两种可能的途径可以遵循。我假设引号剥离是因为引号被认为是一个程序/ INI变量,因此要么是“something”或“somethingelse”,但不是“混合引号”。此外,匹配引号之间的任何内容都将保持不变。
途径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;
}
hgc7kmma

hgc7kmma6#

你需要使用正则表达式,看看:-
http://php.net/manual/en/function.preg-replace.php
或者,在本例中,可以使用substr检查字符串的第一个字符和最后一个字符是否为引号,如果是,则截断字符串。
http://php.net/manual/en/function.substr.php

bfnvny8b

bfnvny8b7#

regex怎么样

//$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
3duebb1j

3duebb1j8#

如果您喜欢性能胜过清晰度,请选择以下方法:

// 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);

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

相关问题