PDA

View Full Version : Regular Expression برای جدا سازی چند خط



Hell Lord
پنج شنبه 17 فروردین 1391, 12:54 عصر
با سلام، من چند فایل دارم که حاوی کتابهایی هست که قبلا در یک نرم افزار خیلی قدیمی کار شده است و برای تشخصی صفحات و عنواین هر بخش، این نرم افزار یک سری متن وارد فایل کتاب کرده است، حالا فایل های اصلی در اختیار نیست و این متن های اضافه اولا" باید از بین بروند، دوم اینکه قبل از از بین رفتن، محتوای بین این خط ها باید جدا بشه، در حقیقت به این صورت هست :

- - - - - - - - - - - - - - - - - - - - [ 1 ] - - - - - - - - - - - - - - - - - - - -

مطلب 1

- - - - - - - - - - - - - - - - - - - - [ 2 ] - - - - - - - - - - - - - - - - - - - -

محتوای 2

- - - - - - - - - - - - - - - - - - - - [ 3 ] - - - - - - - - - - - - - - - - - - - -

مطلب 3

- - - - - - - - - - - - - - - - - - - - [ 4 ] - - - - - - - - - - - - - - - - - - - -

الی آخر و این اعداد بین [ ] همینطور زیاد میشوند و اعداد تا عدد های 3 رقمی هم پیش میروند.

فعلا این مرحله ی اول کار است، چیزی که در سایت استک آور فلو به دستم رسید استفاده از این پترن هستش ولی متاسفانه جواب نداد :

$pattern = '/\-+\[\s\d+\s\]\-+(?:\r?\n|$)/g';

MMSHFE
پنج شنبه 17 فروردین 1391, 13:28 عصر
شما دقیقاً الآن از نمونه متنی که بالا گذاشتین میخواین چه خروجی بگیرین؟

Hell Lord
پنج شنبه 17 فروردین 1391, 14:00 عصر
اون 3 نقطه هارو، البته فکر کنم باید به جا 3 نقطه میگذاشتم مطلب 1 - مطلب 2 - مطلب 3 و الی آخر ... معذرت میخوام درست ننوشتم

MMSHFE
پنج شنبه 17 فروردین 1391, 14:43 عصر
تعداد خط تیره های قبل و بعد از اعداد ثابته؟ یعنی همیشه 20 تاست؟

Hell Lord
پنج شنبه 17 فروردین 1391, 15:55 عصر
بله خدا رو شکر ثابته.

MMSHFE
پنج شنبه 17 فروردین 1391, 16:01 عصر
این کد رو امتحان کنید (اسم فایل رو برحسب نیاز تغییر بدین). فکر کنم با کمی تغییر اون کاری که بخواین رو انجام بده. موفق باشید.


<?php
$lines = file('book.txt');
$posts = array();
$i = -1;
foreach($lines as $line) {
if(substr($line, 0, 40) == '- - - - - - - - - - - - - - - - - - - - ') {
$i++;
$posts[$i] = '';
}
else {
$posts[$i] .= $line.PHP_EOL;
}
}
print_r($posts);
?>

Hell Lord
پنج شنبه 17 فروردین 1391, 16:10 عصر
:متفکر: ممنون، روش خوب و ساده ای بود به مخ بنده اصلا خطور نکرد :گیج:

MMSHFE
پنج شنبه 17 فروردین 1391, 16:31 عصر
خواهش میکنم. دکمه تشکر هم کاربرد خوبی داره البته :چشمک:

رضا قربانی
یک شنبه 24 اردیبهشت 1391, 12:01 عصر
سلام و خسته نباشید.

من یک ورودی دارم به این صورت : علی | رضا | احمد | حسن | که داینامیکه و می تونه هر اسمی با هر تعدادی باشه . حالا می خوام آخرین | که حسن می شه رو نشون بدم .

یعنی من اول باید بیام بعد هر | پایپ نام ها رو بندازم توی یک آرایه و بعد آخرین آرایه رو بخونم که نمی تونم.

ممنون می شم.

AMIBCT
یک شنبه 24 اردیبهشت 1391, 14:05 عصر
.*\|(.+)$

علامت $ در انتها مشخص می‌کنه که عبارت حتما در انتهای جمله باشد

البته نوشتنش الزامی نیست چون عبارت‌های منظم به طور عادی حریصانه عمل می‌کنند
یعنی .* ابتدایی بیشترین تعداد کاراکترهای ممکن را پیدا می‌کند

MMSHFE
سه شنبه 26 اردیبهشت 1391, 18:46 عصر
$names = 'علی|رضا|احمد|حسن|';
$names_arr = explode('|', trim($names, '|'));
$last_name = $names_arr[count($names_arr) - 1];
echo $last_name;
// Output حسن

موفق باشید.

رضا قربانی
پنج شنبه 28 اردیبهشت 1391, 20:27 عصر
عجب داستانی شده ها ....

دست درد نکنه . این explode هم خوب چیزیه . اصلا به فکرم خطور نکرده بود .
البته با Regular-Expression هم می شه . ولی ممنون که راه حل بهتری رو بهم پیشنهاد دادید .

گمون کنم شما خیلی از explodeاستفاده میکنید.

به هر حال تشکر . مشکلم حل شده

MMSHFE
پنج شنبه 28 اردیبهشت 1391, 23:31 عصر
نه خیلی استفاده نمیکنم ولی سعی میکنم تا جایی که امکان انجام کار بدون RegEx وجود داشته باشه از عبارات با قاعده استفاده نکنم چون سرعت پایین میاد. البته در برخی موارد واقعاً چاره ای نیست و هیچ چیز مثل عبارات با قاعده کار آدم رو راه نمیندازه.