【问题标题】:php - string trimphp - 字符串修剪
【发布时间】:2011-06-28 21:11:40
【问题描述】:

请帮帮我。

$str = "col_1          col_2  col_3
row1 row2 row3
row12 row22        row33";

$arr = explode("\n", $str);

foreach($arr as $line)
{
   $temp_arr = explode(WHAT HERE, $line); 
}

如何将每一行分解成数组? 我想要$temp_arr[0] = col_1$temp_arr[1] = col2$temp_arr[2] = col_3 下一行将有$temp_arr[0] = row1$temp_arr[1] = row2

你们太棒了。它适用于我的示例,但不适用于我的实际问题。我导出 windows xp 进程并想分解它们。

Caption CommandLine ProcessId 系统空闲进程 0 系统 4 smss.exe \SystemRoot\System32\smss.exe 604 avgrsx.exe C:\PROGRA~1\AVG\AVG10\avgrsx.exe /restart /boot 692 csrss.exe C:\WINDOWS\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl =关闭 MaxRequestThreads=16 780 winlogon.exe winlogon.exe 820 services.exe C:\WINDOWS\system32\services.exe 880 lsass.exe C:\WINDOWS\system32\lsass.exe 892 nvsvc32.exe C:\WINDOWS\system32\nvsvc32.exe 1052 svchost.exe C:\WINDOWS\system32\svchost -k DcomLaunch 1168 svchost.exe C:\WINDOWS\system32\svchost -k rpcss 1240 svchost.exe C:\WINDOWS\System32\svchost.exe -k netsvcs 1328 svchost.exe C:\WINDOWS\system32\svchost.exe -k NetworkService 1404 svchost.exe C:\WINDOWS\system32\svchost.exe -k LocalService 1520 spoolsv.exe C:\WINDOWS\system32\spoolsv.exe 1664 explorer.exe C:\WINDOWS\Explorer.EXE 1956 jqs.exe "C:\Program Files\Java\jre6\bin\jqs.exe" -service -config "C:\Program Files\Java\jre6\lib\deploy\jqs\jqs.conf" 460 avgtray.exe "C:\Program Files\AVG\AVG10\avgtray.exe" 1156 rundll32.exe "C:\WINDOWS\system32\RUNDLL32.EXE" C:\WINDOWS\system32\NvMcTray.dll,NvTaskbarInit 1204 alg.exe C:\WINDOWS\System32\alg.exe 1376 AVGIDSMonitor.exe "C:\Program Files\AVG\AVG10\Identity Protection\agent\bin\avgidsmonitor.exe" 660 iexplore.exe "C:\Program Files\Internet Explorer\iexplore.exe" 620 OUTLOOK.EXE "C:\Program Files\Microsoft Office\Office12\OUTLOOK.EXE" /recycle 1884 SQLyog.exe "C:\Program Files\SQLyog\SQLyog.exe" 2596 UniKeyNT.exe "C:\Program Files\unikey40RC2-1101-win32\UniKeyNT.exe" 964 avgcsrvx.exe C:\Program Files\AVG\AVG10\avgcsrvx.exe /pipeName=4f758821-d931-4842-ae08-b81fe89b843a /coreSdkOptions=0 /binaryPath="C:\Program Files\AVG\AVG10\" /registryPath= “SYSTEM\CurrentControlSet\Services\Avg\Avg10”3788 svchost.exe C:\WINDOWS\system32\svchost.exe -k imgsvc 3604 mstsc.exe "C:\WINDOWS\system32\mstsc.exe" 3868 notepad++.exe "C:\Program Files\Notepad++\notepad++.exe" 4072 notepad.exe "C:\WINDOWS\system32\NOTEPAD.EXE" C:\Documents and Settings\Quy Nguyen\Desktop\cool.txt 2228 cmd.exe "C:\WINDOWS\system32\cmd.exe" 2552 wmic.exe WMIC /OUTPUT:C:\ProcessList.txt PROCESS get Caption,Commandline,Processid 2480 wmiprvse.exe C:\WINDOWS\system32\wbem\wmiprvse.exe 1744

【问题讨论】:

  • 在代码块的编辑器中使用 ctrl-K 或 {} 按钮。反引号用于简单的单行 sn-ps 或内联引用。
  • 重复我相信某处
  • 我已经编辑了我的答案,以反映您现在发布的问题的解决方案。享受 =)

标签: php string explode


【解决方案1】:

替换

$temp_arr = explode(WHAT HERE, $line);

$temp_arr = preg_split('/\s+/', $line, -1, PREG_SPLIT_NO_EMPTY);

编辑:添加了 PREG_SPLIT_NO_EMPTY

好的,所以你的问题有所改变。这段代码应该完全符合您的要求:

$processes = 'the list you posted';

$temp = preg_split('/\s*(?:\r?\n)+/', $processes, -1, PREG_SPLIT_NO_EMPTY);
$process_list = array();
foreach ($temp as $process) {
    $process_list[] = array_pad( // array_pad makes the length consistent
        preg_split(
            '/\s{2,}/', // match only 2 or more consecutive spaces for splitting
            $process,
            3,
            PREG_SPLIT_NO_EMPTY), // ignore empty matches (i.e., end of line)
        3, // pad array to a length of 3
        ''
    );
}

$process_list_final = array();
$process_list_titles = array_shift($process_list);

foreach ($process_list as &$plist_item) {
    $plist_item = array_combine($process_list_titles, $plist_item);
}

它可能需要一些清理,但你可以自己做 =)

一些功能供您查找:

【讨论】:

  • PREG_SPLIT_NO_EMPTY 将防止您在数组末尾获得空元素。
  • 文档。说If this flag is set, only non-empty pieces will be returned by preg_split().
  • @cwallenpoole:我不明白你说的和我说的不匹配 =) 我指的是这个具体的例子,当然。
  • 另请注意:更改此代码以使其仅经过一个循环并不难,但您必须事先获取标题。虽然从执行的角度来看可以说效率更高,但这种通用性稍差一些。 “这是留给 rea^H^H^H 提问者的练习。”
【解决方案2】:

你可能想要preg_split

$str = "col_1          col_2  col_3
    row1 row2 row3
    row12 row22        row33";

$arr = explode("\n", $str);

foreach($arr as $line)
{
   $temp_arr = preg_split("#\s+#", $line, -1, PREG_SPLIT_NO_EMPTY); 
}

preg_split 与explode 不同,它允许您使用称为正则表达式的东西将字符串拆分成块。在这种情况下:

  • # "开始正则表达式"
  • \s+ 表示“一个或多个连续的空格”。
  • -1 表示不应该对匹配的数量有任何限制(如果您愿意,可以将其更改为您的首选数字)
  • PREG_SPLIT_NO_EMPTY 是一个特殊的常量,它告诉方法永远不会返回空结果,所以你不必担心这个:

        第 1 行

编辑


刚刚注意到您的编辑。您可以将正则表达式修改为"#\s++#" 以使其搜索至少2 个空格,并且您可以继续添加+,或者您可以使用大括号为您完成这项工作。你可以看到更多here

【讨论】:

  • +1 因为你的答案比我的详细得多 =)
【解决方案3】:
$temp_arr = explode("\n", $line); 

【讨论】:

    【解决方案4】:

    在 PHP 中,您可以在 php 中以非常不同的方式做到这一点。

    我不知道你要爆炸的真实数据是什么,但如果你只有空格分隔的数据,你可以这样做:

    foreach ($arr as $line) {
      // removing double-spaces
      while(strpos($line, ' ') !== false) $line = str_replace('  ', ' ', $line);
      // trim leading and trailing spaces. you can safely move it to explode
      $line = trim($line);
      // will be better if you replace double-spaces before. it will be faster a lot.
      //-> just space character (0x20) here now (!)
      $temp_arr = explode(' ', $line);
    }
    

    您还可以使用list 立即将数组拆分为变量。就这样:

    list( $row1, $row2, $lastrow ) = explode(" ", $line);`
    

    不要对这个简单的问题使用 preg_split。太慢了。

    祝你好运)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多