【问题标题】:Replace Array with Numbers and text用数字和文本替换数组
【发布时间】:2019-12-25 11:51:58
【问题描述】:

我的代码是一个简单的代码,但我不知道问题可能是什么。

我正在做一个“for”来获取一个从 1 到 2000 的数字,然后将数字替换为文本,例如 '1px','2px',...

然后我将这个“'1px','2px',...”设置在一个数组中。 出于这个原因,我可以验证文本中的哪个位置有“px”,然后我可以用“%”替换它。 PS:“%”也是一个数组。

要替换文本,我使用 str_replace,它是功能性的,但在我的代码中使用它时不是。

$search = array('150px','151px','152px','153px','154px',...);
$replace = array('100%');
$testes = str_replace($search, $replace, $GetText)

$GetText 示例 - <p><img src="data:image/png;base64,iVBOC" data-filename="andy-brown_4.png" style="width: 150px;"><br></p>

此代码有效

现在我正在尝试的代码,

for($i = 1; $i<=2000; $i++) {
  echo "'". $i . 'px' . "'," ;
  $test = "'". $i . 'px' . "'," ;
}  

用文字显示从 1 到 2000 的所有数字,例如:'274px',

$search = array($test);
$replace = array('100%');
$testes = str_replace($search, $replace, $GetText)

在这个过程中,它不会将“px”替换为“%”

【问题讨论】:

  • 您缺少逗号array('100%);
  • @treyBake 它缺少一个单引号:)
  • 邮政编码作为代码,而不是作为图像
  • 所以echo "'". $i . 'px' . "'," ; 可能是echo "'$ipx'," ;
  • @MichaelLuis - 不会,因为您在每次迭代中覆盖变量的值。

标签: php arrays str-replace


【解决方案1】:

你可以用一个php函数preg_replace来解决你的任务

$GetText = '<p><img src="data:image/png;base64,iVBOC" data-filename="andy-brown_4.png" style="width: 150px;"><br></p>';

$result = preg_replace("/\d{1,4}px/","100%",$GetText);

var_dump($result);

\d{1,4}px 的意思是: \d - 搜索数字, {1,4} - 前一个元素(例如数字)必须重复 1 到 4 次, px - 后面必须有这个文字,

所以它会查找像*px 这样的所有内容并将其替换为100%,其中* 是从09999 的任意数字;

【讨论】:

  • $result 的输出给我 Null
  • 这是经过测试的代码。 @MichaelLuis 你是用我的代码尝试了 1to1 还是改变了什么?你有什么php版本?
  • php 版本 7.2
  • 我是这样做的,并且成功了:$result= preg_replace("([0-9]+px)", "100%", $GetText);
  • 很高兴您知道如何为您的任务使用正则表达式。感谢更新。
【解决方案2】:

如果你想在这个循环之外创建一个数组,那么构建一个数组而不是一个字符串。

顺便说一句,每次循环执行$test = "'". $i . 'px' . "'," ; 都会覆盖$test 变量,这意味着您最终会在该字符串中得到一个值,即$test = '2000px'

for($i = 1; $i<=2000; $i++) {
    echo "'". $i . 'px' . "'," ;
    //$test = "'". $i . 'px' . "'," ;
    $test[] = "{$i}px";
}

或者如果你喜欢

for($i = 1; $i<=2000; $i++) {
    $test[] = $i . 'px';
}

【讨论】:

  • 回声可能相同,但它构建的数组不同
  • 在您的代码中执行 echo $test;,您将看到 JUST 2000px
  • 我也是,我只是设置回声看看我会给我什么
  • 在循环后添加一行以执行echo $test;,您只会看到2000px
  • 但是您的 ECHO 和设置 $test 值的行不做同样的事情
【解决方案3】:

如您所见here str_replace 接受数组“此函数返回一个字符串或一个数组,其中主题中所有出现的搜索都替换为给定的替换值。” ,但我认为在你的情况下你可以使用preg_replace

$search = []; // define search array
$GetText = '<p><img src="data:image/png;base64,iVBOC" data-filename="andy-brown_4.png" style="width: 150px;"><br></p>';//dummy text
for($i = 1; $i<=2000; $i++) {
   $search[] =  " ". $i . 'px' ; // this will push new element into the array
}  

$testes = str_replace($search, ' 100%', $GetText); // this will change every element from $search array to ' 100%'
var_dump($testes); // returns <p><img src="data:image/png;base64,iVBOC" data-filename="andy-brown_4.png" style="width: 100%;"><br></p>

var_dump(preg_replace('/(\d+)px/i','100%',$GetText));// this will give you the same result 

【讨论】:

  • @RiggsFolly 这是 str_replace 的奥秘 试试这个 str_replace(["50px", "150px"], '100%', $GetText);它将返回“宽度:1 100%;” ...等
  • @RiggsFolly 我真的不喜欢 str_replace 有 2k 个元素
  • 我也不是,但如果没有真正了解 OP 真正想要做什么,很难/很危险地提出其他建议 :)
【解决方案4】:

你想要一个数组,但在这里处理一个字符串:

$test = "'".$i.'px'."',";

这段代码总是重写$test字符串,所以$test总是等于'2000px',

但是你需要像这样填充一个数组:

$test[] =  $i.'px';

请注意,这里不需要引号,因为 str_replace 将在文本中查找引号(我相信在大多数情况下它不会找到它们)。

接下来你需要从 2000 到 1,从大到小,因为 str_replace 将取代第一次找到的出现。

如果你有210px,str_replace 会找到10px 并用你的100% 替换它,你得到2100%

因此,工作代码可能如下所示:

$GetText = '<p><img src="data:image/png;base64,iVBOC" data-filename="andy-brown_4.png" style="width: 150px;"><br></p>';

$search = array();

for($i = 2000; $i>=1; $i--) {
    $search[] = $i . 'px';
}

$replace = '100%';

$result = str_replace($search, $replace, $GetText);

var_dump($result);

希望这就是你要找的。​​p>

【讨论】:

    【解决方案5】:

    您可以使用 str_ireplace 轻松完成

    search = array($test);
    $replace = array('100%');
    $testes = str_ireplace($search, $replace, $GetText);
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多