هل من الممكن إظهار أرقام الأسطر عند استخدام regex في PHP؟

StackOverflow https://stackoverflow.com/questions/3560640

  •  01-10-2019
  •  | 
  •  

سؤال

هل من الممكن أن يكون لديك regex تبحث عن سلسلة مثل ' bfunction b' التي ستعرض رقم السطر حيث عثرت على المباراة؟

هل كانت مفيدة؟

المحلول

سأقترح شيئًا قد يناسبك ،

// Get a file into an array.  In this example we'll go through HTTP to get
// the HTML source of a URL.
$lines = file('http://www.example.com/');

// Loop through our array, show HTML source as HTML source; and line numbers too.
foreach ($lines as $line_num => $line) {
    // do the regular expression or sub string search here
}

نصائح أخرى

لا توجد طريقة بسيطة للقيام بذلك ، ولكن إذا أردت ذلك ، فيمكنك التقاط إزاحة المباراة (باستخدام PREG_OFFSET_CAPTURE العلم ل preg_match أو preg_match_all) ثم حدد السطر الذي يوجد فيه هذا الموقع في سلسلتك عن طريق حساب عدد الخطوط الجديدة (على سبيل المثال) التي تحدث قبل هذه النقطة.

فمثلا:

$matches = array();
preg_match('/\bfunction\b/', $string, $matches, PREG_OFFSET_CAPTURE);
list($capture, $offset) = $matches[0];
$line_number = substr_count(substr($string, 0, $offset), "\n") + 1; // 1st line would have 0 \n's, etc.

اعتمادًا على ما يشكل "خطًا" في التطبيق الخاص بك ، قد ترغب في البحث عنه بالتناوب \r\n أو <br> (ولكن هذا سيكون أكثر صعوبة بعض الشيء لأنك يجب أن تستخدم إعادة حساب أخرى لحسابها <br /> أو <br style="...">, ، إلخ.).

بقدر ما أعلم أنه ليس كذلك ، ولكن إذا كنت في نظام Linux أو نظام آخر يشبه Unix ، grep سيفعل ذلك ويمكنه استخدام (تقريبا) نفس بناء جملة التعبير العادي مثل preg_ عائلة الوظائف مع -P علَم.

لا. يمكنك تمرير علامة preg_offset_capture إلى preg_match ، ستخبرك Witch عن الإزاحة بالبايت. ومع ذلك ، لا توجد طريقة سهلة لتحويل هذا إلى رقم سطر.

هذا ليس regex ، ولكنه يعمل:

$offset = strpos($code, 'function');
$lines = explode("\n", substr($code, 0, $offset));
$the_line = count($lines);

أوس! هذا ليس JS!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top