用php或者laravel怎么切割一个文件?

用php或者laravel怎么切割一个文件?
比如,有个location.blade.php

    <div class="card-block">
        <div class="row">
            <div class="col-1">北京</div>
            <div class="col-11">
                <a href="#" class="card-link">东城</a>
                <a href="#" class="card-link">西城</a>
                <a href="#" class="card-link">朝阳</a>
                <a href="#" class="card-link">海淀</a>
            </div>
        </div>
    </div>
    <div class="card-block">
        <div class="row">
            <div class="col-1">上海</div>
            <div class="col-11">
                <a href="#" class="card-link">黄浦</a>
                <a href="#" class="card-link">卢湾</a>
                <a href="#" class="card-link">徐汇</a>
                <a href="#" class="card-link">长宁</a>
            </div>
        </div>
    </div>
    <div class="card-block">
        <div class="row">
            <div class="col-1">天津</div>
            <div class="col-11">
                <a href="#" class="card-link">和平</a>
                <a href="#" class="card-link">河东</a>
                <a href="#" class="card-link">河西</a>
                <a href="#" class="card-link">南开</a>
            </div>
        </div>
    </div>

我想写个脚本,把它切割成三个文件:
beijing.blade.php

    <div class="card-block">
        <div class="row">
            <div class="col-1">北京</div>
            <div class="col-11">
                <a href="#" class="card-link">东城</a>
                <a href="#" class="card-link">西城</a>
                <a href="#" class="card-link">朝阳</a>
                <a href="#" class="card-link">海淀</a>
            </div>
        </div>
    </div>

shanghai.blade.php

    <div class="card-block">
        <div class="row">
            <div class="col-1">上海</div>
            <div class="col-11">
                <a href="#" class="card-link">黄浦</a>
                <a href="#" class="card-link">卢湾</a>
                <a href="#" class="card-link">徐汇</a>
                <a href="#" class="card-link">长宁</a>
            </div>
        </div>
    </div>

tianjin.blade.php

    <div class="card-block">
        <div class="row">
            <div class="col-1">天津</div>
            <div class="col-11">
                <a href="#" class="card-link">和平</a>
                <a href="#" class="card-link">河东</a>
                <a href="#" class="card-link">河西</a>
                <a href="#" class="card-link">南开</a>
            </div>
        </div>
    </div>

需要怎么做?请大神帮说一下。

阅读 3.8k
4 个回答
<?php

/**
 * segmentfault: https://segmentfault.com/q/1010000010569991
 *
 * @language php
 * @uses     SplFileObject
 * @version  1.0
 * @author   Pu Shaowei
 */
define('DIR', __DIR__ . DIRECTORY_SEPARATOR);
FileSplit(DIR . 'location.blade.php');

function FileSplit($filePath)
{
    header('Content-Type:text/html; charset=UTF-8');
    $file     = new  \SplFileObject($filePath, 'r+');
    $fileInfo = null;
    while (!$file->eof()) {
        $fileInfo .= $file->current();
        $file->next();
    }

    $Simple    = array_filter(explode('<div class="card-block">', $fileInfo));
    $tempArray = array_map(function ($val) {
        return '<div class="card-block">' . $val;
    }, $Simple);

    // corresponding
    $corresponding = [
        '北京' => 'beijing.blade.php',
        '上海' => 'shanghai.blade.php',
        '天津' => 'tianjin.blade.php'
    ];

    //each
    foreach ($tempArray as $value) {
        foreach ($corresponding as $_key => $_value) {
            if (!strpos($_key, $value)) {
                $file = null;
                $file = new  \SplFileObject(DIR . $_value, 'w+');
                $file->fwrite(mb_convert_encoding($value,'HTML-ENTITIES',"UTF-8"));
            }
        }
    }
    //off file object
    $file = null;
}

方法很多啊,

简单的字符串切割法:

$html = file_get_contents('location.blade.php');
$html = str_replace(PHP_EOL, '', $html);
$parts = explode('<div class="card-block">', $html);
array_shift($parts);
$parts = array_map(function($i) { return '<div class="card-block">'.$i; }, $parts);
var_dump($parts[0], $parts[1], $parts[2]);

逐行判断法:

$parts = [];
$html = file_get_contents('location.blade.php');

$lines = explode(PHP_EOL, $html);
$stackedLines = [];
foreach ($lines as $line) {
    if (strpos($line, '<div class="card-block">') !== false  and $stackedLines) {
        $parts[] = implode('', $stackedLines);
        $stackedLines = [];
    } 
    $stackedLines[] = $line.PHP_EOL;
}
$parts[] = implode('', $stackedLines);

var_dump($parts[0], $parts[1], $parts[2]);

其他还可以解析成dom结构等方法,根据自己需要的获取吧。

难道laravel不是php?

你打算分割文件的规则的什么?不会就是简单的一个大div是一个文件吧?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题